Une option consiste à utiliser l'image IO comme ceci:
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());
}
}
: Pitfalls
- Il est lent que l'image io cadre en général
- Il échoue inexplicablement quelques images rares. Exemple (javax.imageio.IIOException: pas un fichier JPEG: commence par 0xff 0xe2)
- Il faut utiliser le même modèle de couleur pour les images source et cible. Par conséquent, vous ne pouvez pas utiliser l'interpolation bilinéaire ou bicubique
Vous voulez dire les données exif? – beerbajay
Non - à quoi sert "exif"? Jamais entendu cela. –
Oui - c'est ce dont j'ai besoin - Wikipedia: les données Exif sont intégrées dans le fichier image lui-même. Alors que de nombreux programmes récents de manipulation d'images reconnaissent et conservent les données Exif lors de l'écriture sur une image modifiée, ce n'est pas le cas pour la plupart des programmes plus anciens. –