• Java通过图片url地址获取图片base64位字符串的两种方式


    工作中遇到通过图片的url获取图片base64位的需求。一开始是用网上的方法,通过工具类Toolkit,虽然实现的代码比较简短,不过偶尔会遇到图片转成base64位不正确的情况,至今不知道为啥。

    之后,又去网上搜了通过获取图片的二进制流转换成base64的方式,两种方式,都是亲测有效,通过Toolkit偶尔会出现,转base64后,展示不完整的问题。所以建议用通过下载二进制流转换的方式进行转换。

    下面附上代码:

    复制代码
    import java.awt.image.BufferedImage;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    
    import javax.imageio.ImageIO;
    import javax.swing.ImageIcon;
    
    
    import java.awt.Graphics;
    import java.awt.GraphicsConfiguration;
    import java.awt.GraphicsDevice;
    import java.awt.GraphicsEnvironment;
    import java.awt.HeadlessException;
    import java.awt.Image;
    import java.awt.Toolkit;
    import java.awt.Transparency;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    
    public class ImageUtils {
    
        
        
        public static String getBase64ByImgUrl(String url){
            String suffix = url.substring(url.lastIndexOf(".") + 1);
            try {
                URL urls = new URL(url);
                ByteArrayOutputStream  baos = new ByteArrayOutputStream();
                Image image = Toolkit.getDefaultToolkit().getImage(urls);
                BufferedImage  biOut = toBufferedImage(image);
                ImageIO.write(biOut, suffix, baos);
                String base64Str = Base64Util.encode(baos.toByteArray());
                return base64Str;
            } catch (Exception e) {
                return "";
            }
            
        }
        
        public static BufferedImage toBufferedImage(Image image) {  
            if (image instanceof BufferedImage) {  
                return (BufferedImage) image;  
            }  
            // This code ensures that all the pixels in the image are loaded  
            image = new ImageIcon(image).getImage();  
            BufferedImage bimage = null;  
            GraphicsEnvironment ge = GraphicsEnvironment  
                    .getLocalGraphicsEnvironment();  
            try {  
                int transparency = Transparency.OPAQUE;  
                GraphicsDevice gs = ge.getDefaultScreenDevice();  
                GraphicsConfiguration gc = gs.getDefaultConfiguration();  
                bimage = gc.createCompatibleImage(image.getWidth(null),  
                        image.getHeight(null), transparency);  
            } catch (HeadlessException e) {  
                // The system does not have a screen  
            }  
            if (bimage == null) {  
                // Create a buffered image using the default color model  
                int type = BufferedImage.TYPE_INT_RGB;  
                bimage = new BufferedImage(image.getWidth(null),  
                        image.getHeight(null), type);  
            }  
            // Copy image to buffered image  
            Graphics g = bimage.createGraphics();  
            // Paint the image onto the buffered image  
            g.drawImage(image, 0, 0, null);  
            g.dispose();  
            return bimage;  
        }  
        /**
         * 通过图片的url获取图片的base64字符串
         * @param imgUrl    图片url
         * @return    返回图片base64的字符串
         */
        public static String image2Base64(String imgUrl) {  
    
            URL url = null;  
    
            InputStream is = null;   
    
            ByteArrayOutputStream outStream = null;  
    
            HttpURLConnection httpUrl = null;  
    
            try{  
    
                url = new URL(imgUrl);  
    
                httpUrl = (HttpURLConnection) url.openConnection();  
    
                httpUrl.connect();  
    
                httpUrl.getInputStream();  
    
                is = httpUrl.getInputStream();            
    
                  
    
                outStream = new ByteArrayOutputStream();  
    
                //创建一个Buffer字符串  
    
                byte[] buffer = new byte[1024];  
    
                //每次读取的字符串长度,如果为-1,代表全部读取完毕  
    
                int len = 0;  
    
                //使用一个输入流从buffer里把数据读取出来  
    
                while( (len=is.read(buffer)) != -1 ){  
    
                    //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度  
    
                    outStream.write(buffer, 0, len);  
    
                }  
    
                // 对字节数组Base64编码  
    
                return Base64Util.encode(outStream.toByteArray());  
    
            }catch (Exception e) {  
    
                e.printStackTrace();  
    
            }  
    
            finally{  
    
                if(is != null)  
    
                {  
    
                    try {  
    
                        is.close();  
    
                    } catch (IOException e) {  
    
                        e.printStackTrace();  
    
                    }  
    
                }  
    
                if(outStream != null)  
    
                {  
    
                    try {  
    
                        outStream.close();  
    
                    } catch (IOException e) {  
    
                        e.printStackTrace();  
    
                    }  
    
                }  
    
                if(httpUrl != null)  
    
                {  
    
                    httpUrl.disconnect();  
    
                }  
    
            }  
    
            return imgUrl;  
    
        }  
    }    
    复制代码

    其中

    getBase64ByImgUrl方法为通过Toolkit获取的方式,至于为啥没注释,因为我也看不懂原理,也是抄来的。
    image2Base64方法为通过下载二进制流的方式,当然也是抄来的。写出来是为了总结一下。下次遇到相同的问题,不用到处查了。
    附上Base64Util的代码:
    复制代码
     1 import java.io.ByteArrayOutputStream;
     2 import java.io.File;
     3 import java.io.IOException;
     4 import java.util.regex.Matcher;
     5 import java.util.regex.Pattern;
     6 
     7 import javax.imageio.stream.FileImageInputStream;
     8 
     9 import sun.misc.BASE64Decoder;
    10 import sun.misc.BASE64Encoder;
    11 
    12 public class Base64Util{
    13     /**
    14      * 字符串转图片
    15      * @param base64Str
    16      * @return
    17      */
    18     public static byte[] decode(String base64Str){
    19         byte[] b = null;
    20         BASE64Decoder decoder = new BASE64Decoder();
    21         try {
    22             b = decoder.decodeBuffer(replaceEnter(base64Str));
    23         } catch (IOException e) {
    24             e.printStackTrace();
    25         }
    26         return b;
    27     }
    28     
    29     /**
    30      * 图片转字符串
    31      * @param image
    32      * @return
    33      */
    34     public static String encode(byte[] image){
    35         BASE64Encoder decoder = new BASE64Encoder();
    36         return replaceEnter(decoder.encode(image));
    37     }
    38     
    39     public static String encode(String uri){
    40         BASE64Encoder encoder = new BASE64Encoder();
    41         return replaceEnter(encoder.encode(uri.getBytes()));
    42     }
    43     
    44     /**
    45      * 
    46      * @path    图片路径
    47      * @return
    48      */
    49     
    50     public static byte[] imageTobyte(String path){
    51         byte[] data = null;
    52         FileImageInputStream input = null;
    53         try {
    54             input = new FileImageInputStream(new File(path));
    55             ByteArrayOutputStream output = new ByteArrayOutputStream();
    56             byte[] buf = new byte[1024];
    57             int numBytesRead = 0;
    58             while((numBytesRead = input.read(buf)) != -1){
    59                 output.write(buf, 0, numBytesRead);
    60             }
    61             data = output.toByteArray();
    62             output.close();
    63             input.close();
    64             
    65         } catch (Exception e) {
    66             e.printStackTrace();
    67         }
    68         
    69         return data;
    70     }
    71     
    72     
    73     
    74     public static String replaceEnter(String str){
    75         String reg ="[\n-\r]";
    76         Pattern p = Pattern.compile(reg);
    77         Matcher m = p.matcher(str);
    78         return m.replaceAll("");
    79     }
    80     
    81     
    82 }
    复制代码
  • 相关阅读:
    Mysql升级过程的问题
    关于SSM项目注解事务不回滚的问题
    Linux环境下tomcat如何热部署
    Windows系统下python3中安装pyMysql
    jvm性能监控及故障处理工具(《深入理解java虚拟机》)
    jvm垃圾回收器(《深入理解java虚拟机》)
    jvm-运行时数据区域(《深入理解java虚拟机》)
    java源码分析-String
    java源码分析-Object
    2019秋季PAT甲级题解(无第一题)
  • 原文地址:https://www.cnblogs.com/Anonyme/p/12704304.html
Copyright © 2020-2023  润新知