调整图像文件大小保留jpg Exif信息

时间:2012-06-12 15:08:06

标签: java parameters image-resizing exif

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

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

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

2 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分: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开头)
  • 它需要对源图像和目标图像使用相同的颜色模型。因此,您不能使用双线性或双三次插值