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 }
Java通过图片url地址获取图片base64位字符串的两种方式相关推荐
- Vue由本地js中存放的url地址获取图片
Vue由本地js中存放的url地址获取图片 对象必须放在js中(而不是json里面,json没有require).如果是在json中,需要采用其他方式去获取 注意:url地址必须用这种形式,有requ ...
- java 获取星期几_java中获取日期是星期几的两种方法
java中取得指定日期是星期几可以采用下面两种方式取得日期是星期几:(推荐:java视频教程) 1.使用Calendar类//根据日期取得星期几 public static String getWee ...
- OpenWrt 获取 WAN口 IPv4的IP 两种方式
文章目录 OpenWrt 获取 WAN口 IPv4的IP 两种方式 前言 1.ifconfig获取 2.ubus获取 后话 OpenWrt 获取 WAN口 IPv4的IP 两种方式 前言 ssh连接到 ...
- java 接收json 字符串_spring接收json字符串的两种方式
一.前言 前几天遇到一个问题,前端H5调用我的springboot一个接口(post方式,@RequestParameter接收参数),传入的参数接收不到.自己测试接口时使用postman的form- ...
- 通过文件url地址获取base64;通过图片url地址获取base64;js获取文件的base64
本篇是通过url地址获取文件的base64 如果想要通过File文件获取base64查看这篇 以下代码可直接复制使用!注意第9行的图片地址更改下 <template><div cla ...
- [Java中实现Excel表导入导出]基于easy-poi和EasyExcel两种方式实现
第一种:基于easy-poi实现Excel导入导出 1.导出Excel表格 第一步:在pom文件中导入依赖 <!--基于easy-poi实现Excel导入导出--><dependen ...
- Java面试题:synchronized和对象的访问定位的两种方式
说一说自己对于 synchronized 关键字的理解 ? synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者 代码块在任意时 ...
- Java并发基础01. 传统线程技术中创建线程的两种方式
传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...
- java native函数库_Java 层调用 Native 层函数的两种方式
概述 Java 层如何调用Native层函数,大家都应该知道使用JNI(Java 本地接口). 通过在java层声明native方法,然后遵守JNI规范命名Native函数,即可建立Java层nati ...
最新文章
- LeetCode1117. Building H2O --Java解法--多线程保证执行顺序--AtomicInteger
- Linux下文件描述符
- HTML 5核心内容
- SpringMVC_Controller注解与RequestMapping
- 磁盘大小限制_Linux服务器磁盘爆满查询之百度云服务器
- java oracle序列化_Java序列化(Serialization)的理解
- word 转 PDF时报错
- PyTorch:卷积/padding/pooling api
- 多层交换综合实验(二)
- 2021年大学生网络安全邀请赛暨第七届上海市大学生网络安全大赛“东华杯”Misc(全)-Writeup
- 学习笔记---高等数学前置知识---约分、通分
- 数仓工具—Hive语法之窗口函数first_value和last_value(12)
- Latex bare_jrnl模板报错:something‘s wrong--perhaps a missing\item. \end{thebibliography}
- python下载博文中微博图床图片
- Unity 微信小游戏转回WEBGL发布设置
- 电信流失客户特征分析及预测
- pip3 install -i sklearn 安装报错
- 【延期通知】Elastic 中国开发者大会 2021 举办日期延期至3月5日
- 食品行业渠道商商城系统渠道利益透明,加速企业资金回笼
- buuoj Pwn writeup 166-170