Question

Le système je travaille a une fonction pour extraire les métadonnées des fichiers JPEG en utilisant le package com.drew.metadata. http://www.drewnoakes.com/code/exif/ Cependant qui est limité à les fichiers JPEG, et maintenant un client a demandé sur l'extraction IPTC de TIF, et éventuellement d'autres formats d'image.

Quelqu'un sait-il sur les API similaires à Drew Noakes un, qui peut extraire IPTC de TIF?

Idéalement, ce serait une approche purement Java, comme le com.drew.metadata un.

Était-ce utile?

La solution

Ceci est une vieille question. Aujourd'hui, ma bibliothèque metadata-extractor prend en charge les fichiers TIFF, ainsi que JPEG, WebP, PSD, PNG, GIF, BMP, ICO, PCX et beaucoup de formats Camera Raw.

Le projet a récemment déménagé à GitHub:

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

est disponible via Maven:

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

Autres conseils

J'ai passé quelque temps à coder récemment la partie de manipulation des métadonnées de icafe Java bibliothèque d'images et de le rendre capable pour insérer et extraire les types de métadonnées comme EXIF, IPTC, PHOTOSHOP, ICC_Profile, vignettes etc. Certaines fonctions sont mieux que d'autres, mais ils travaillent tous relativement bien. Il y a une interface commune pour toutes les lectures de métadonnées ci-dessous:

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 on passe l'image « iptc.tif » dans le répertoire « images » du projet comme argument, nous allons obtenir les informations suivantes:

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

Le code ci-dessus fonctionne pour les fichiers JPEG et TIFF semblables. Il détecte automatiquement le type d'image et délégué au code correspondant pour faire le travail.

NOTE: il pourrait y avoir plus d'un endroit dans un fichier TIFF qui contient des données IPTC. L'une est étiquette RichTiffIPTC, l'autre est enterré dans une balise Photoshop. À l'heure actuelle, icafe conserve une seule des données IPTC. Si les deux étiquette Photoshop avec des données IPTC et une étiquette RichTiffIPTC existe, il gardera les données RichTiffIPTC. Dans le cas contraire, selon étiquette existe, il gardera les données IPTC de cette balise. Il n'y a pas de problème de maintien des données des deux endroits. la mise en œuvre actuelle à l'aide d'une carte mapper une clé de type de métadonnées à une méta-données unique. Donc, il garde une seule instance de métadonnées unique.

Mise à jour: icafe peuvent désormais combiner les données IPTC à la fois RichTiffIPTC et CISR Photoshop et supprimer les doublons.

Update2: La classe de base de tous les types de métadonnées dans ICAFE - métadonnées implémente maintenant l'interface Iterable afin que l'utilisateur peut désormais itérer à travers une collection de MetadataEntry. MetadataEntry lui-même est créé en utilisant un modèle composite ainsi MetadataEntry peut contenir un ensemble d'autres MetadataEntry. Chaque MetadataEntry contient une clé et une paire de valeur. Cette conception permet une structure arborescente traversal des entrées de métadonnées.

Il y a un bon exemple d'utilisation de la lib imageio pour accéder IPTC ici

http: // www .barregren.se / blog / comment lire-exif-et-IPTC-java-image-io-api

Malheureusement, vous aurez encore à gérer une partie du travail vous-même.

Si vous ne trouvez pas un pur implémentation Java, vous pouvez envisager d'utiliser les liaisons Java à ImageMagick ( JMagick ). Cela permettrait une pléthore de formats de sortie possibles.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top