java - 在不删除其 EXIF 数据的情况下处理图像

标签 java bitmap bufferedimage image-resizing javax.imageio

使用 imageIO,我通常会遇到转换图像文件的问题,在覆盖它之后,它会丢失所有的 EXIF 数据。有没有什么方法可以在不先提取、缓存然后重置的情况下保留它?

最佳答案

ImageIO 本身确实具有此功能,但您需要使用 ImageReader 而不是 ImageIO.read:

ImageReader reader = ImageIO.getImageReadersBySuffix("jpg").next();

(您可能还想检查这样的阅读器是否存在)。 然后你需要设置输入:

reader.setInput(ImageIO.createImageInputStream(your_imput_stream));

现在您可以保存您的元数据:

IIOMetadata metadata = reader.getImageMetadata(0); 
                            // As far as I understand you should provide 
                            // index as tiff images could have multiple pages

然后读取图像:

BufferedImage bi = reader.read(0);

当你想保存新图片时,你应该使用ImageWriter:

// I'm writing to byte array in memory, but you may use any other stream
ByteArrayOutputStream os = new ByteArrayOutputStream(255);
ImageOutputStream ios = ImageIO.createImageOutputStream(os);

Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName("jpeg");
ImageWriter writer = iter.next();
writer.setOutput(ios);

//You may want also to alter jpeg quality
ImageWriteParam iwParam = writer.getDefaultWriteParam();
iwParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
iwParam.setCompressionQuality(.95f);

//Note: we're using metadata we've already saved.
writer.write(null, new IIOImage(bi, null, metadata), iwParam);
writer.dispose();

//ImageIO.write(bi, "jpg", ios); <- This was initially in the code but actually it was only adding image again at the end of the file.

因为这是一个老话题,我想这个答案有点太晚了,但可能会对其他人有所帮助,因为这个话题仍然可以在谷歌上搜索。

关于java - 在不删除其 EXIF 数据的情况下处理图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8972357/

相关文章:

java - 解释 Collections doc.oracle 中的语句

java - 欧拉计划 97

java - 如何加密 BufferedImage 使其只能由程序读取?

c++ - 查询区分 0 值的位图

java - 如何加载 BufferedImage 作为资源以及将其放置在哪里?

java - 将父对象转换为子对象 - BufferedImage 对象

java - 推荐一个 Java/Android 游戏库——卡、板等?

java - Foursquare Java API v2 - checkin 示例

android - 在 JNI 中将位图转换为 Opencv::Mat

asp.net - 如何使用 C# 在 ASP.NET 中识别 CMYK 图像