Java 调整图像文件大小,保留jpg Exif信息
我想复制所有Exif图像数据也被复制的图像 我有一个Java应用程序,它将jpg读入图像对象,调整其大小,然后将图像对象写入另一个文件夹中的jpg文件 问题是它丢失了所有漂亮的图像信息(相机、日期等等)。Java 调整图像文件大小,保留jpg Exif信息,java,parameters,image-resizing,exif,Java,Parameters,Image Resizing,Exif,我想复制所有Exif图像数据也被复制的图像 我有一个Java应用程序,它将jpg读入图像对象,调整其大小,然后将图像对象写入另一个文件夹中的jpg文件 问题是它丢失了所有漂亮的图像信息(相机、日期等等)。 有什么想法吗?尽管该解决方案是针对Android的,但它是Java的,应该有助于将所有EXIF元数据从一个文件复制到另一个文件: 请注意,Sanselan最近被更名为Commons Imaging,可在此处找到: 尽管该解决方案是为Android设计的,但它采用Java语言,有助于将所有EX
有什么想法吗?尽管该解决方案是针对Android的,但它是Java的,应该有助于将所有EXIF元数据从一个文件复制到另一个文件: 请注意,Sanselan最近被更名为Commons Imaging,可在此处找到:
尽管该解决方案是为Android设计的,但它采用Java语言,有助于将所有EXIF元数据从一个文件复制到另一个文件: 请注意,Sanselan最近被更名为Commons Imaging,可在此处找到:
一个选项是像这样使用图像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());
}
}
try(ImageInputStream-inputStream=newfileimageinputstream(新文件(“Landscape_3.jpg”)){
迭代器readerIterator=ImageIO.getImageReaders(inputStream);
ImageReader=ReaderInterator.next();
reader.setInput(inputStream);
迭代器imageIterator=reader.readAll(null);
IIOImage image=imageIterator.next();
BuffereImage srcImage=(BuffereImage)image.getRenderImage();
AffineTransformOp scaleOp=新的AffineTransformOp(AffineTransform.getScaleInstance(0.5,0.5),AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
BuffereImage resultImage=scaleOp.createCompatibleDestImage(srcImage,null);
resultImage=scaleOp.filter(srcImage,resultImage);
image.setRenderImage(结果图像);
ImageWriter writer=ImageIO.getImageWriter(读卡器);
try(ImageOutputStream outputStream=新文件ImageOutputStream(新文件(“Landscape\u 3\u preserve\u exif.jpg”)){
writer.setOutput(outputStream);
作家。写作(形象);
}
try(ImageOutputStream outputStream=新文件ImageOutputStream(新文件(“Landscape\u 3\u discard\u exif.jpg”)){
writer.setOutput(outputStream);
write(image.getrenderimage());
}
}
陷阱:
- 一般来说,它和图像io框架一样慢
- 对于一些罕见的图像,它莫名其妙地失败了。示例(javax.imageio.IIOException:非JPEG文件:以0xff 0xe2开头)
- 它要求对源图像和目标图像使用相同的颜色模型。因此,不能使用双线性或双三次插值
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());
}
}
try(ImageInputStream-inputStream=newfileimageinputstream(新文件(“Landscape_3.jpg”)){
迭代器readerIterator=ImageIO.getImageReaders(inputStream);
ImageReader=ReaderInterator.next();
reader.setInput(inputStream);
迭代器imageIterator=reader.readAll(null);
IIOImage image=imageIterator.next();
BuffereImage srcImage=(BuffereImage)image.getRenderImage();
AffineTransformOp scaleOp=新的AffineTransformOp(AffineTransform.getScaleInstance(0.5,0.5),AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
BuffereImage resultImage=scaleOp.createCompatibleDestImage(srcImage,null);
resultImage=scaleOp.filter(srcImage,resultImage);
image.setRenderImage(结果图像);
ImageWriter writer=ImageIO.getImageWriter(读卡器);
try(ImageOutputStream outputStream=新文件ImageOutputStream(新文件(“Landscape\u 3\u preserve\u exif.jpg”)){
writer.setOutput(outputStream);
作家。写作(形象);
}
try(ImageOutputStream outputStream=新文件ImageOutputStream(新文件(“Landscape\u 3\u discard\u exif.jpg”)){
writer.setOutput(outputStream);
write(image.getrenderimage());
}
}
陷阱:
- 一般来说,它和图像io框架一样慢
- 对于一些罕见的图像,它莫名其妙地失败了。示例(javax.imageio.IIOException:非JPEG文件:以0xff 0xe2开头)
- 它要求对源图像和目标图像使用相同的颜色模型。因此,不能使用双线性或双三次插值