通常网络传输图片采用base64 格式,因此在编程时遇到了药将图片文件读取成base64 的格式,和将base64格式的字符串转化为图片的情况
下面是我写的工具类
注:base64转图片时需要先去掉前缀
package com.sharetime.util;
import com.ctc.wstx.util.StringUtil;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import java.io.*;
/**
* @Author: yd
* @Date: 2018/7/29 11:05
* @Version 1.0
*/
public class Base64Utils {
/**
* 将图片文件转换成base64字符串,参数为该图片的路径
*
* @param imageFile
* @return java.lang.String
*/
public String ImageToBase64(String imageFile) {
InputStream in = null;
byte[] data = null;
// 读取图片字节数组
try {
in = new FileInputStream(imageFile);
data = new byte[in.available()];
in.read(data);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
// 对字节数组Base64编码
BASE64Encoder encoder = new BASE64Encoder();
if (data != null) {
return "data:image/jpeg;base64," + encoder.encode(data);// 返回Base64编码过的字节数组字符串
}
return null;
}
/**
* 将base64解码成图片并保存在传入的路径下
* 第一个参数为base64 ,第二个参数为路径
*
* @param base64, imgFilePath
* @return boolean
*/
public boolean Base64ToImage(String base64, String imgFilePath) {
// 对字节数组字符串进行Base64解码并生成图片
if (base64 == null) // 图像数据为空
return false;
BASE64Decoder decoder = new BASE64Decoder();
try {
// Base64解码
byte[] b = decoder.decodeBuffer(base64);
for (int i = 0; i < b.length; ++i) {
if (b[i] < 0) {// 调整异常数据
b[i] += 256;
}
}
OutputStream out = new FileOutputStream(imgFilePath);
out.write(b);
out.flush();
out.close();
return true;
} catch (Exception e) {
return false;
}
}
/**
* 用来测试工具类是否成功
*
* @param args
* @return void
*/
public static void main(String[] args) {
String path = "C:/Users/YD/Pictures/1.jpg";
Base64Utils base64Utils = new Base64Utils();
String s = base64Utils.ImageToBase64(path);
System.out.println(s);
String newpath = "C:/Users/YD/Pictures/asd.jpg";
boolean b = base64Utils.Base64ToImage(s, newpath);
System.out.println(b);
}
}
注:还需要注意的一点是,在网站上src=base64的格式也可以将图片显示出来,但是在图片的前面需要加入标识data:image/jpeg;base64
因此在服务端获取到网页传过来的base64字符串时要注意是否包含前缀如果包含前缀则需要去掉在进行转换
image为从网络传过来的base64格式的字符串
int i = image.indexOf("base64,")+7;//获取前缀data:image/gif;base64,的坐标
String newImage = image.substring(i, image.length());//去除前缀