Java工具类-处理Image与Base64加密字符串互相转换的工具类

处理Image与Base64加密字符串互相转换的工具类

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Base64;

import javax.imageio.stream.FileImageOutputStream;

import org.apache.commons.lang3.StringUtils;

import lombok.Cleanup;
import lombok.NonNull;

/**
 * @ClassName ImageUtils
 * @Description 处理Image与Base64加密字符串互相转换的工具类
 */
public class ImageUtils {

	public static final String JPEG = "jpeg";
	public static final String JPG = "jpg";
	public static final String PNG = "png";
	public static final String GIF = "gif";

	/**
	 * @Title: imageToBase64
	 * @Description: 根据输入图片路径,将图片转换为base64加密字符串
	 * @param path - 图片的路径
	 * @return String - 图片对应的base64加密字符串
	 */
	public static String imageToBase64(String path) {
		byte[] base64 = null;

		try {
			@Cleanup
			InputStream in = new FileInputStream(path);
			base64 = new byte[in.available()];
			in.read(base64);
		} catch (Exception e) {
			e.printStackTrace();
		}
		//需要后续修改,根据具体图片类型拼接具体base64文件头
		return base64 == null ? null : "data:image/jpeg;base64," + Base64.getEncoder().encodeToString(base64);
	}

	/**
	 * @Title: base64ToImage
	 * @Description: 根据base64加密字符串生成图片的字节数组
	 * @param base64 - 图片对应的base64加密字符串
	 * @return byte[] - 图片的字节数组
	 */
	public static byte[] base64ToImage(String base64) {
		byte[] bytes = null;
		if (StringUtils.isBlank(base64)) {
			return bytes;
		}

		try {
			// Base64解码
			bytes = Base64.getDecoder().decode(base64);
			for (int i = 0; i < bytes.length; ++i) {
				if (bytes[i] < 0) {// 调整异常数据
					bytes[i] += 256;
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return bytes;
	}

	/**
	 * @Title: base64ToImage
	 * @Description: 根据base64加密字符串和图片路径生成图片(.jpeg)至该路径
	 * @param base64 - 图片对应的base64加密字符串
	 * @param path - 生成图片的路径
	 * @return boolean - true: 转换成功, false: 转换失败
	 */
	public static boolean base64ToImage(String base64, @NonNull String path, @NonNull String fileName, String suffix) {
		byte[] bytes = base64ToImage(base64);
		if (bytes != null) {
			try {
				//为存储图片创建目录
				File file = new File(path);
				if (!file.exists()) {
					file.mkdirs();
				}

				//输出图片文件
				@Cleanup
				FileImageOutputStream out = new FileImageOutputStream(new File(generateImageFilePath(path, fileName, suffix)));
				out.write(bytes, 0, bytes.length);
				out.flush();
				return true;
			} catch (Exception e) {
				e.printStackTrace();
				return false;
			}
		}
		return false;
	}

	public static String generateImageFilePath(@NonNull String path, @NonNull String fullFileName) {
		return path + "//" + fullFileName;
	}

	public static String generateImageFilePath(String path, @NonNull String fileName, String suffix) {
		if (suffix == null) {
			suffix = JPEG;
		}
		if (suffix.contains(JPG)) {
			suffix = JPG;
		} else if (suffix.contains(JPEG)) {
			suffix = JPEG;
		} else if (suffix.contains(PNG)) {
			suffix = PNG;
		} else if (suffix.contains(GIF)) {
			suffix = GIF;
		} else {
			suffix = JPEG;
		}
		return path == null ? fileName + "." + suffix : path + "//" + fileName + "." + suffix;
	}

	/**
	 * @Title: getClearPhotoString
	 * @Description: 截取base64加密信息头(文件格式信息),并返回剩余信息
	 * @return String 被截取后的剩余信息
	 */
	public static String getClearPhotoString(String photoString) {
		int delLength = photoString.indexOf(",") + 1;
		return photoString.substring(delLength, photoString.length());
	}

	/**
	 * @Title: getPhotoType
	 * @Description: 根据完整的base64加密信息头获取图片格式
	 * @return String 图片格式
	 */
	public static String getPhotoType(String photoString) {
		int colonIndex = photoString.indexOf(":");
		int semiIndex = photoString.indexOf(";");
		if (colonIndex > 0 && semiIndex > 0) {
			return photoString.substring(colonIndex + 1, semiIndex);
		}
		return null;
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亚历山大伟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值