【问题标题】:Resize image file retaining jpg Exif information调整保留jpg Exif信息的图像文件大小
【发布时间】:2015-10-29 07:17:35
【问题描述】:

我想复制同时复制了所有 Exif 图像数据的图像。

我有一个 Java 应用程序,它将 jpg 读入图像对象,调整其大小,然后将图像对象写入另一个文件夹中的 jpg 文件。

问题在于它丢失了所有漂亮的图像信息(相机、日期等)。 有什么想法吗?

【问题讨论】:

  • 否 - 什么是“exif”?我从来没有听说过。
  • 是的 - 这就是我需要的 - 维基百科:Exif 数据嵌入在图像文件本身中。虽然许多最近的图像处理程序在写入修改后的图像时会识别并保留 Exif 数据,但大多数旧程序并非如此。
  • 我找到了drewnoakes.com/code/exif - java 中的元数据提取。我会试试这个包,让你知道......
  • 不,那只是为了提取/阅读。我现在找到了这个:包 org.apache.sanselan

标签: java parameters image-resizing exif


【解决方案1】:

虽然是为 Android 设计的,但这个解决方案是用 Java 编写的,应该有助于将所有 EXIF 元数据从一个文件复制到另一个文件:

http://bricolsoftconsulting.com/copying-exif-metadata-using-sanselan/

请注意,Sanselan 最近已更名为 Commons Imaging,可在此处找到:

http://commons.apache.org/imaging/

【讨论】:

    【解决方案2】:

    一种选择是像这样使用图像 IO:

    try (ImageInputStream inputStream = new FileImageInputStream(new File("Landscape_3.jpg"))) {
            Iterator<ImageReader> readerIterator = ImageIO.getImageReaders(inputStream);
            ImageReader reader = readerIterator.next();
            reader.setInput(inputStream);
            Iterator<IIOImage> imageIterator = reader.readAll(null);
            IIOImage image = imageIterator.next();
    
            BufferedImage srcImage = (BufferedImage) image.getRenderedImage();
            AffineTransformOp scaleOp = new AffineTransformOp(AffineTransform.getScaleInstance(0.5, 0.5), AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
            BufferedImage resultImage = scaleOp.createCompatibleDestImage(srcImage, null);
            resultImage = scaleOp.filter(srcImage, resultImage);
            image.setRenderedImage(resultImage);
    
            ImageWriter writer = ImageIO.getImageWriter(reader);
            try (ImageOutputStream outputStream = new FileImageOutputStream(new File("Landscape_3_preserve_exif.jpg"))) {
                writer.setOutput(outputStream);
                writer.write(image);
            }
            try (ImageOutputStream outputStream = new FileImageOutputStream(new File("Landscape_3_discard_exif.jpg"))) {
                writer.setOutput(outputStream);
                writer.write(image.getRenderedImage());
            }
        }
    

    陷阱:

    • 作为一般的图像 io 框架,速度很慢
    • 对于一些罕见的图像,它会莫名其妙地失败。示例(javax.imageio.IIOException:不是 JPEG 文件:以 0xff 0xe2 开头)
    • 它要求对源图像和目标图像使用相同的颜色模型。因此,您不能使用双线性或双三次插值

    【讨论】:

      猜你喜欢
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 2012-11-15
      • 2021-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-09
      相关资源
      最近更新 更多