Pergunta

O sistema que estou trabalhando tem um recurso para extrair metadados de arquivos JPEG usando o pacote com.drew.metadata. http://www.drewnoakes.com/code/exif/ No entanto, que é limitada a ficheiros JPEG e, agora, um cliente pediu sobre como extrair IPTC de TIF, e possivelmente outros formatos de imagem.

Alguém sabe sobre APIs semelhantes com Drew Noakes um, que pode extrair IPTC de TIF?

Idealmente, isso seria uma abordagem Java puro como o com.drew.metadata.

Foi útil?

Solução

Esta é uma questão de idade. Hoje em dia os meus arquivos metadata-extractor biblioteca suporta TIFF, bem como JPEG, WebP, PSD, PNG, GIF, BMP, ICO, PCX e muitos câmera formatos RAW.

O projeto recentemente se mudou para GitHub:

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

E está disponível via Maven:

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

Outras dicas

Eu passei algum tempo recentemente codificação parte manipulação de metadados de iCafé Java biblioteca de imagens e torná-lo capaz para inserir e extrair metadados tipos, como EXIF, IPTC, Photoshop, ICC_Profile, miniaturas etc. Algumas funções são melhores que outros, mas todos relativamente bom trabalho. Há uma interface comum para toda leitura mostrado os metadados abaixo:

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 passarmos a imagem "iptc.tif" do diretório "imagens" do projeto como argumento, vamos obter as seguintes informações:

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

O código acima funciona para JPEG e TIFF iguais. Ele detecta automaticamente o tipo de imagem e delegado ao código correspondente para fazer o trabalho.

NOTA: pode haver mais de um lugares em um arquivo TIFF que contém dados IPTC. Um deles é tag RichTiffIPTC, o outro é enterrado dentro de uma marca Photoshop. Atualmente, iCafe só mantém um dados IPTC. Se ambos tag Photoshop com dados IPTC e uma exist tag RichTiffIPTC, ele irá manter os dados RichTiffIPTC. Caso contrário, o que existe tag, ele irá manter os dados IPTC daquele tag. Não há nenhum problema manter os dados de ambos os lugares. implementação atual usando um mapa mapeamento de uma chave tipo de metadados a um metadados único. Por isso, só mantém uma instância de metadados único.

Update: iCafé agora pode combinar dados de IPTC de ambos RichTiffIPTC e Photoshop IRB e duplicatas remover.

Update2: A classe base de todos os tipos de metadados em ICAFE - metadados agora implementa a interface Iterable para que o usuário pode agora iterate através de uma coleção de MetadataEntry. si MetadataEntry é criado usando padrão compósito assim um MetadataEntry pode conter um conjunto de outros MetadataEntry. Cada MetadataEntry contém uma chave e um par de valor. Este projeto permite um percurso estrutura de árvore das entradas de metadados.

Há um bom exemplo do uso da lib imageio ao acesso IPTC aqui

http: // www .barregren.se / blog / how-ler-exif-and-iptc-java-imagem-io-api

Infelizmente, você ainda tem que lidar com algum do trabalho você mesmo.

Se você não consegue encontrar uma implementação Java puro, você poderia pensar em usar as ligações Java para ImageMagick ( JMagick ). Isso permitiria uma infinidade de diferentes formatos possível saída.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top