Base64图片工具类

package controller;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Base64;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class Base64ImgUtil {

	/**
	 * 编码方法 ,jdk要求:1.8及以上
	 */
	public static String base64Encode(byte[] sorce) {
		String encode = Base64.getEncoder().encodeToString(sorce);
		return encode;
	}

	/**
	 * 解码方法,jdk要求:1.8及以上
	 */
	public static byte[] base64Decode(String sorce) {
		byte[] decode = Base64.getDecoder().decode(sorce);
		return decode;
	}

	/**
	 * 编码方法
	 */
	public static String base64Encode2(byte[] sorce) {
		BASE64Encoder encoder = new BASE64Encoder();
		String encode = encoder.encode(sorce);
		return encode;
	}

	/**
	 * 解码方法
	 */
	public static byte[] base64Decode2(String sorce) {
		BASE64Decoder decoder = new BASE64Decoder();
		byte[] decode = null;
		try {
			decode = decoder.decodeBuffer(sorce);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return decode;
	}

	/**
	 * 读取流中的数据到内存
	 */
	public static byte[] readToBytes(InputStream inStream) throws IOException {
		ByteArrayOutputStream outStream = new ByteArrayOutputStream();
		// 创建一个Buffer字符串
		byte[] buffer = new byte[10240];
		// 每次读取的字符串长度,如果为-1,代表全部读取完毕
		int len = 0;
		// 使用一个输入流从buffer里把数据读取出来
		while ((len = inStream.read(buffer)) != -1) {
			// 用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
			outStream.write(buffer, 0, len);
		}
		// 关闭输入流
		inStream.close();
		// 把outStream里的数据写入内存
		return outStream.toByteArray();
	}

	private static String[] imgTypes = { "png", "jpg", "jpeg", "ico", "gif" };

	/**
	 * 获得Data URI Scheme前缀
	 */
	public static String getDUSPrefix(String imgType) {
		for (String type : imgTypes) {
			if (type.equals(imgType)) {
				return "data:image/" + type + ";base64,";
			}
		}
		return "data:image/jpeg;base64,";
	}

	/**
	 * 获得图片类型
	 */
	public static String getImgType(String imgPath) {
		String type = imgPath.substring(imgPath.lastIndexOf(".") + 1);
		return type.toLowerCase();
	}

	/**
	 * 通过图片路径将图片文件转为Base64编码字符串
	 */
	public static String convertImgToBase64ImgStr(String imgPath) throws IOException {
		InputStream in = new FileInputStream(imgPath);
		String imgType = getImgType(imgPath);
		return convertImgToBase64ImgStr(in, imgType);
	}

	/**
	 * 图片流转Base64编码
	 */
	public static String convertImgToBase64ImgStr(InputStream in, String imgType) throws IOException {
		byte[] bs = readToBytes(in);
		String str = base64Encode(bs);
		String prefix = getDUSPrefix(imgType);
		return prefix + str;
	}

	/**
	 * 将Base64编码的图片字符串转为图片文件字节数组
	 */
	public static byte[] convertBase64ImgStrToBytes(String base64ImgStr) throws UnsupportedEncodingException {
		base64ImgStr = base64ImgStr.substring(base64ImgStr.indexOf(',') + 1);// 例如:去除data:image/jpeg;base64,
		byte[] base64ImgBytes = base64Decode(base64ImgStr);
		return base64ImgBytes;
	}

	/**
	 * 获得Base64编码的图片字符串的图片类型信息
	 */
	public static String getImgTypeFormBase64Img(String base64ImgStr) {
		String data = base64ImgStr.substring(0, base64ImgStr.indexOf(';'));
		String type = data.substring(data.indexOf('/'));
		return type;
	}

	// test
	public static void main(String[] args) throws Exception {
		String str = convertImgToBase64ImgStr("D:\\temp.jpg");
		System.out.println(str);
		byte[] bs = convertBase64ImgStrToBytes(str);
		FileOutputStream fos = new FileOutputStream("D:\\temp2.jpg");
		fos.write(bs);
		fos.flush();
		fos.close();
	}

}

Tips:

目前,Data URI scheme支持的类型有:
data:,文本数据
data:text/plain,文本数据
data:text/html,HTML代码
data:text/html;base64,base64编码的HTML代码
data:text/css,CSS代码
data:text/css;base64,base64编码的CSS代码
data:text/javascript,Javascript代码
data:text/javascript;base64,base64编码的Javascript代码
data:image/gif;base64,base64编码的gif图片数据
data:image/png;base64,base64编码的png图片数据
data:image/jpeg;base64,base64编码的jpeg图片数据
data:image/x-icon;base64,base64编码的icon图片数据

什么是Base64:
https://blog.csdn.net/qq_22771739/article/details/90084526

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值