Pregunta

El sistema que estoy trabajando tiene una función para extraer metadatos de los archivos JPEG mediante el paquete com.drew.metadata. http://www.drewnoakes.com/code/exif/ Sin embargo, que se limita a Los archivos JPEG, y ahora que un cliente ha preguntado por la extracción de IPTC de TIF, y posiblemente otros formatos de imagen.

¿Alguien sabe acerca de las API similares a los de Drew Noakes uno, que puede extraer IPTC de TIF?

Lo ideal sería que este sería un enfoque de Java puro como el com.drew.metadata uno.

¿Fue útil?

Solución

Esta es una vieja cuestión. Hoy en día mi biblioteca metadata-extractor es compatible con archivos TIFF, JPEG, así como, WebP, PSD, PNG, GIF, BMP, ICO, PCX y muchos formatos RAW de cámara.

El proyecto recientemente trasladado a GitHub:

https://github.com/drewnoakes/metadata-extractor

y está disponible a través de Maven:

http://search.maven.org/#search%7Cga%7C1% 7Cdrewnoakes

Otros consejos

pasé algún tiempo recientemente codificación de la parte de manipulación de metadatos de la biblioteca de imágenes icafe Java y que sea capaz para insertar y extraer tipos de metadatos como EXIF, IPTC, PHOTOSHOP, ICC_Profile, miniatura, etc. Algunas funciones son mejores que otros, pero todos ellos relativamente funcionar bien. Hay una interfaz común para toda la lectura de metadatos se muestra a continuación:

import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Iterator;

import com.icafe4j.image.meta.Metadata;
import com.icafe4j.image.meta.MetadataEntry;
import com.icafe4j.image.meta.MetadataType;
import com.icafe4j.image.meta.iptc.IPTC;

public class ExtractIPTC {

    public static void main(String[] args) throws IOException {
        Map<MetadataType, Metadata> metadataMap = Metadata.readMetadata(args[0]);
        IPTC iptc = (IPTC)metadataMap.get(MetadataType.IPTC);

        if(iptc != null) {
            Iterator<MetadataEntry> iterator = iptc.iterator();

            while(iterator.hasNext()) {
                MetadataEntry item = iterator.next();
                printMetadata(item, "", "     ");
            }
        }   
    }
    private void printMetadata(MetadataEntry entry, String indent, String increment) {
        logger.info(indent + entry.getKey() (StringUtils.isNullOrEmpty(entry.getValue())? "" : ": " + entry.getValue()));
        if(entry.isMetadataEntryGroup()) {
             indent += increment;
             Collection<MetadataEntry> entries = entry.getMetadataEntries();
             for(MetadataEntry e : entries) {
                printMetadata(e, indent, increment);
             }          
        }
    }   
}

Si pasamos la imagen "iptc.tif" de las "imágenes" del directorio del proyecto como argumento, vamos a obtener la siguiente información:

Record number 2: Application Record
Dataset name: Keywords
Dataset tag: 25[0x0019]
Dataset size: 6
Dataset value: Bayern
Record number 2: Application Record
Dataset name: Keywords
Dataset tag: 25[0x0019]
Dataset size: 11
Dataset value: Deckelstein
Record number 2: Application Record
Dataset name: Keywords
Dataset tag: 25[0x0019]
Dataset size: 7
Dataset value: Germany
Record number 2: Application Record
Dataset name: Keywords
Dataset tag: 25[0x0019]
Dataset size: 10
Dataset value: Nittendorf

El código anterior funciona para JPEG y TIFF por igual. Detecta automáticamente el tipo de imagen y delegado de código correspondiente para hacer el trabajo.

NOTA: no puede haber más de uno coloca en un archivo TIFF que contiene datos IPTC. Una de ellas es la etiqueta RichTiffIPTC, el otro está enterrado dentro de una etiqueta Photoshop. Actualmente, sólo mantiene una icafe datos IPTC. Si existe tanto Photoshop etiqueta con los datos IPTC y una etiqueta de RichTiffIPTC, que se mantendrá los datos RichTiffIPTC. De lo contrario, lo que existe la etiqueta, que se mantendrá los datos IPTC de esa etiqueta. No hay ningún problema de mantenimiento de datos de ambos lugares. implementación actual usando un mapa de asignación de una tecla de tipo de metadatos a una única metadatos. Por lo tanto, sólo mantiene una instancia de metadatos única.

Actualización: icafe ahora puede combinar datos IPTC de ambos y RichTiffIPTC Photoshop IRB y eliminar duplicados.

Update2: La clase base de todos los tipos de metadatos en ICAFE - Metadatos ahora implementa la interfaz Iterable lo que el usuario ahora puede iterar a través de una colección de MetadataEntry. MetadataEntry sí mismo se crea utilizando patrón compuesto por lo que un MetadataEntry puede contener una colección de otros MetadataEntry. Cada MetadataEntry contiene una clave y un par de valores. Este diseño permite un recorrido de estructura de árbol de las entradas de metadatos.

Hay un buen ejemplo de la utilización de la lib imageio acceder a IPTC aquí

http: // www .barregren.se / blog / cómo-read-Exif-y-IPTC-java-imagen-io-api

Por desgracia, todavía tendrá que manejar algunos de los trabajos usted mismo.

Si no puede encontrar una aplicación en Java puro, usted podría considerar el uso de los enlaces Java a ImageMagick ( JMagick ). Que permitiría una plétora de diferentes formatos de salida posible.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top