工作中遇到通过图片的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 }

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

  1. Vue由本地js中存放的url地址获取图片

    Vue由本地js中存放的url地址获取图片 对象必须放在js中(而不是json里面,json没有require).如果是在json中,需要采用其他方式去获取 注意:url地址必须用这种形式,有requ ...

  2. java 获取星期几_java中获取日期是星期几的两种方法

    java中取得指定日期是星期几可以采用下面两种方式取得日期是星期几:(推荐:java视频教程) 1.使用Calendar类//根据日期取得星期几 public static String getWee ...

  3. OpenWrt 获取 WAN口 IPv4的IP 两种方式

    文章目录 OpenWrt 获取 WAN口 IPv4的IP 两种方式 前言 1.ifconfig获取 2.ubus获取 后话 OpenWrt 获取 WAN口 IPv4的IP 两种方式 前言 ssh连接到 ...

  4. java 接收json 字符串_spring接收json字符串的两种方式

    一.前言 前几天遇到一个问题,前端H5调用我的springboot一个接口(post方式,@RequestParameter接收参数),传入的参数接收不到.自己测试接口时使用postman的form- ...

  5. 通过文件url地址获取base64;通过图片url地址获取base64;js获取文件的base64

    本篇是通过url地址获取文件的base64 如果想要通过File文件获取base64查看这篇 以下代码可直接复制使用!注意第9行的图片地址更改下 <template><div cla ...

  6. [Java中实现Excel表导入导出]基于easy-poi和EasyExcel两种方式实现

    第一种:基于easy-poi实现Excel导入导出 1.导出Excel表格 第一步:在pom文件中导入依赖 <!--基于easy-poi实现Excel导入导出--><dependen ...

  7. Java面试题:synchronized和对象的访问定位的两种方式

    说一说自己对于 synchronized 关键字的理解 ? synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者 代码块在任意时 ...

  8. Java并发基础01. 传统线程技术中创建线程的两种方式

    传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...

  9. java native函数库_Java 层调用 Native 层函数的两种方式

    概述 Java 层如何调用Native层函数,大家都应该知道使用JNI(Java 本地接口). 通过在java层声明native方法,然后遵守JNI规范命名Native函数,即可建立Java层nati ...

最新文章

  1. LeetCode1117. Building H2O --Java解法--多线程保证执行顺序--AtomicInteger
  2. Linux下文件描述符
  3. HTML 5核心内容
  4. SpringMVC_Controller注解与RequestMapping
  5. 磁盘大小限制_Linux服务器磁盘爆满查询之百度云服务器
  6. java oracle序列化_Java序列化(Serialization)的理解
  7. word 转 PDF时报错
  8. PyTorch:卷积/padding/pooling api
  9. 多层交换综合实验(二)
  10. 2021年大学生网络安全邀请赛暨第七届上海市大学生网络安全大赛“东华杯”Misc(全)-Writeup
  11. 学习笔记---高等数学前置知识---约分、通分
  12. 数仓工具—Hive语法之窗口函数first_value和last_value(12)
  13. Latex bare_jrnl模板报错:something‘s wrong--perhaps a missing\item. \end{thebibliography}
  14. python下载博文中微博图床图片
  15. Unity 微信小游戏转回WEBGL发布设置
  16. 电信流失客户特征分析及预测
  17. pip3 install -i sklearn 安装报错
  18. 【延期通知】Elastic 中国开发者大会 2021 举办日期延期至3月5日
  19. 食品行业渠道商商城系统渠道利益透明,加速企业资金回笼
  20. buuoj Pwn writeup 166-170

热门文章

  1. NDS 火焰之纹章 新暗黑龙与光之剑(FC复刻版)DeSmuME 完美模拟
  2. 分享一篇python常用库
  3. 来写一波402博客地址(纯粹东搞西搞)
  4. SOAP最全Web Service渗透测试总结
  5. 如何提取图片中的文字?一个方法帮你搞定
  6. Mac(Catalina)上的AI换脸,手把手教小白使用DeepFaceLab
  7. 地址映射与共享———2
  8. 搜狗权重批量查询 批量查询搜狗权重的方法
  9. Unity 接口回调
  10. python解释器的提示符号是什么_python解释器的提示符是什么