2012-06-12 1 views
2

Je souhaite copier des images avec toutes les données d'image Exif également copiées.Redimensionner le fichier image en conservant les informations jpg Exif

J'ai une application Java qui lit dans un jpg dans un objet image, le redimensionne, puis écrit l'objet image dans un fichier jpg dans un autre dossier.

Le problème est qu'il perd toutes ces belles informations d'image (caméra, date, etc.). Des idées?

+0

Vous voulez dire les données exif? – beerbajay

+0

Non - à quoi sert "exif"? Jamais entendu cela. –

+0

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. –

Répondre

0

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
Questions connexes