Java 通过图片Base64编码获取图片的大小、高度、宽度、DPI信息

背景

       有些图片是三方通过base64传到自己的系统,因为附件容量限制,需要对图片的一些信息做判断,下面是获取图片常用属性的方法

Base64转换流

String contentType = getSubUtilSimple(photo, "data:image/(.*?);base64,");
String certPhoto = photo.replace(String.format("data:image/%s;base64,", contentType), "");
byte[] decodeBuffer = Base64Util.decodeBuffer(certPhoto);
ByteArrayInputStream inputStream = new ByteArrayInputStream(decodeBuffer);

获取图片的大小

System.out.println("图片大小:" + decodeBuffer.length);

获取图片的高度和宽度

inputStream = new ByteArrayInputStream(decodeBuffer);
BufferedImage read = ImageIO.read(inputStream);
System.out.println("图片高度:" + read.getHeight());
System.out.println("图片宽度:" + read.getWidth());

获取图片的DPI

ByteArrayInputStream inputStream = new ByteArrayInputStream(decodeBuffer);
Metadata metadata = ImageMetadataReader.readMetadata(inputStream);
// 提取 DPI 信息
ExifIFD0Directory exifDirectory = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class);
if (exifDirectory != null) {
    Integer xDpi = exifDirectory.getInteger(ExifIFD0Directory.TAG_X_RESOLUTION);
    Integer yDpi = exifDirectory.getInteger(ExifIFD0Directory.TAG_Y_RESOLUTION);
    System.out.println("X DPI: " + (xDpi != null ? xDpi : "未知"));
    System.out.println("Y DPI: " + (yDpi != null ? yDpi : "未知"));
}
else {
    System.out.println("未找到 DPI 信息");
}

结果展示

注意点:

  • 图片格式限制

    • 并不是所有图片格式都会包含 DPI 信息。
    • JPEG 和 TIFF 格式通常支持存储 DPI 信息,但 PNG、GIF 等格式并不强制包含 DPI 信息。
  • 图片生成方式

    • 如果图片是通过某些绘图工具或简单的截图工具生成的,可能不会嵌入 DPI 元数据。
    • 在线压缩、转换工具有时会移除元数据信息以减少文件大小。
  • 元数据被移除

    • 一些图片在传输或保存时会被优化,可能会丢失元数据,包括 DPI。
  • 用户未设置 DPI

    • 如果创建图片时未明确设置 DPI,工具可能使用默认值或省略 DPI 信息。
Base64编码是一种将二进制数据转换为ASCII字符的编码方式,它将原始数据按照固定的规则转换成一串字符。由于Base64编码使用了64个字符来表示64个不同的值,因此编码后的数据大小会比原始数据稍微大一些。 具体到图片的情况,使用Base64编码图片转换成字符串后,其大小会比原始图片大小大约增加1/3左右。这是因为Base64编码后的字符串中会包含一些额外的字符,用来表示原始数据的编码格式。 需要注意的是,大图片转换成Base64编码后的字符串会非常长,可能会导致数据传输的效率降低。因此,在实际应用中,如果需要传输大图片,建议直接传输图片的URL或者使用其他方式进行传输,而不是将图片转换成Base64编码字符串传输。 参考资料: 之前一直有用过对图片进行base64编码,然后将base64编码后的串放在请求体中传输,由于http本身并没有对请求体的大小进行限制,因此也并未对图片大小以及编码后的base64大小进行过研究。因为目前我们的技术架构方面,前端直接访问网关层,由于网关层对body体进行了大小限制,因此我需要了解图片base64编码之间的大小关系。 :https://c.runoob.com/front-end/59这个工具蛮好用的,大图片就用它转base64。 :主要介绍了基于JavaScript获取base64图片大小,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下。 :当把byte[]通过Convert.ToBase64String转换成Base64编码字符串时数据会明显变大,是为什么呢?我们就先探究一下什么是Base64编码?<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值