Cambiar el tamaño del archivo de imagen conservando la información jpg Exif

Me gustaría copiar imágenes con todos los datos de imagen Exif también copiados.

Tengo una aplicación Java que lee un jpg en un objeto de imagen, lo cambia de tamaño y luego escribe el objeto de imagen en un archivo jpg en otra carpeta.

El problema es que pierde toda esa buena información de la imagen (cámara, fecha, etc.). ¿Algunas ideas?

preguntado el 12 de junio de 12 a las 16:06

No, ¿qué es "exif"? Nunca he escuchado de eso. -

Sí, eso es lo que necesito: Wikipedia: los datos Exif están incrustados en el archivo de imagen. Si bien muchos programas de manipulación de imágenes recientes reconocen y conservan los datos Exif cuando escriben en una imagen modificada, este no es el caso de la mayoría de los programas más antiguos. -

Encontré drawnoakes.com/code/exif - extracción de metadatos en java. Probaré este paquete y te dejaré saber... -

No, eso es solo para extraer/leer. Ahora encontré esto: paquete org.apache.sanselan -

2 Respuestas

Aunque está diseñada para Android, esta solución está en Java y debería ser útil para copiar todos los metadatos EXIF ​​de un archivo a otro:

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

Tenga en cuenta que Sanselan ha sido rebautizado recientemente como Commons Imaging y se puede encontrar aquí:

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

Respondido 26 Jul 13, 05:07

Una opción es usar la imagen IO como esta:

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());
        }
    }

Escollos:

  • Es lento como image io framework en general
  • Falla inexplicablemente para algunas imágenes raras. Ejemplo (javax.imageio.IIOException: no es un archivo JPEG: comienza con 0xff 0xe2)
  • Requiere usar el mismo modelo de color para las imágenes de origen y de destino. Como resultado, no puede usar la interpolación bilineal o bicúbica

Respondido 28 Oct 15, 23:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.