2

我想复制带有所有 Exif 图像数据的图像。

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

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

4

2 回答 2

0

虽然适用于 Android,但此解决方案是 Java 语言,应该有助于将所有 EXIF 元数据从一个文件复制到另一个文件:

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

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

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

于 2012-12-09T03:08:46.283 回答
0

一种选择是像这样使用图像 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 开头)
  • 它要求对源图像和目标图像使用相同的颜色模型。因此,您不能使用双线性或双三次插值
于 2015-10-28T23:17:35.097 回答