Domanda

Il sistema su cui sto lavorando ha una funzione per estrarre i metadati da file JPEG utilizzando il pacchetto com.drew.metadata. http://www.drewnoakes.com/code/exif/ Tuttavia, che si limita a file JPEG, e ora che un cliente ha chiesto di estrarre IPTC da TIF, e, eventualmente, altri formati di immagine.

Qualcuno sa su API simili a Drew Noakes uno, in grado di estrarre IPTC da TIF?

L'ideale sarebbe un approccio puro Java come com.drew.metadata uno.

È stato utile?

Soluzione

Questa è una vecchia questione. Al giorno d'oggi la mia libreria metadata-extractor supporta i file TIFF, così come JPEG, WebP, PSD, PNG, GIF, BMP, ICO, PCX e molti formati raw della fotocamera.

Il progetto recentemente trasferito a GitHub:

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

ed è disponibile tramite Maven:

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

Altri suggerimenti

ho trascorso qualche tempo recente codifica la parte manipolazione dei metadati di ICAFE Java libreria di immagini e renderlo in grado per inserire ed estrarre i tipi di metadati come EXIF, IPTC, PHOTOSHOP, ICC_Profile, miniature, ecc Alcune funzioni sono migliori di altri, ma tutti relativamente funzionare bene. C'è un'interfaccia comune per tutti la lettura dei metadati illustrato di seguito:

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

Se passiamo l'immagine "iptc.tif" dalle "immagini" directory del progetto come argomento, ci sarà ottenere le seguenti informazioni:

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

Il codice precedente funziona per JPEG e TIFF simili. Si rileva automaticamente il tipo di immagine e delegato al codice corrispondente per fare il lavoro.

Nota: ci potrebbe essere più di un posti in un file TIFF, che contiene i dati IPTC. Uno è tag RichTiffIPTC, l'altro è sepolto all'interno di un tag di Photoshop. Attualmente, ICAFE conserva solo uno dei dati IPTC. Se entrambi tag Photoshop con i dati IPTC e un tag RichTiffIPTC esiste, non mancherà di tenere i dati RichTiffIPTC. In caso contrario, a seconda di quale esiste tag, manterrà i dati IPTC da quel tag. Non c'è nessun problema mantenendo i dati da entrambi i luoghi. implementazione corrente utilizzando una mappa mappatura di una chiave tipo di metadati a un metadati unica. Così mantiene una sola istanza di metadati unica.

Aggiornamento: ICAFE possono ora combinare i dati IPTC sia da RichTiffIPTC e Photoshop IRB e rimuovere i duplicati.

Update2: La classe di base di tutti i tipi di metadati in ICAFE - Metadati ora implementa l'interfaccia Iterable modo che l'utente può ora scorrere una collezione di MetadataEntry. MetadataEntry stesso viene creato usando composite così un MetadataEntry può contenere una raccolta di altri MetadataEntry. Ogni MetadataEntry contiene una chiave ed una coppia valore. Questo design permette per una struttura ad albero attraversamento delle voci di metadati.

C'è un buon esempio di utilizzare il lib imageio per accedere IPTC qui

http: // www .barregren.se / blog / how-read-exif-e-IPTC-java-image-io-api

Purtroppo, avrai ancora per gestire una parte del lavoro da soli.

Se non riesci a trovare un'implementazione Java puro, si potrebbe prendere in considerazione utilizzando i binding Java per ImageMagick ( JMagick ). Che permetterebbe una pletora di diversi formati di output possibile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top