2

私が取り組んでいるシステムには、com.drew.metadataパッケージを使用して JPEG ファイルからメタデータを抽出する機能があります。http://www.drewnoakes.com/code/exif/ただし、これは JPEG ファイルに限定されており、顧客から、TIF から IPTC を抽出したり、場合によっては他の画像形式を抽出したりすることについて問い合わせがありました。

TIF から IPTC を抽出できる Drew Noakes のものと同様の API について知っている人はいますか?

理想的には、これは 1 つのような純粋な Java アプローチになりcom.drew.metadataます。

4

4 に答える 4

2

最近、 icafe Java 画像ライブラリのメタデータ操作部分のコーディングに時間を費やし、EXIF、IPTC、PHOTOSHOP、ICC_Profile、サムネイルなどのメタデータ タイプを挿入および抽出できるようにしました。一部の機能は他の機能よりも優れていますが、それらはすべて比較的うまく機能します。 . 以下に示すすべてのメタデータの読み取りに共通のインターフェイスがあります。

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

プロジェクトの「images」ディレクトリからイメージ「iptc.tif」を引数として渡すと、次の情報が得られます。

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

上記のコードは、JPEG と TIFF の両方で機能します。画像の種類を自動的に検出し、対応するコードに委任して作業を行います。

注: IPTC データを含む TIFF ファイルには複数の場所が存在する可能性があります。1 つは RichTiffIPTC タグで、もう 1 つは Photoshop タグ内に埋め込まれています。現在、icafe が保持する IPTC データは 1 つだけです。IPTC データを持つ Photoshop タグと RichTiffIPTC タグの両方が存在する場合、RichTiffIPTC データが保持されます。それ以外の場合、どのタグが存在しても、そのタグからの IPTC データが保持されます。両方の場所からデータを保持することに問題はありません。メタデータ型のキーを一意のメタデータにマッピングするマップを使用した現在の実装。そのため、一意のメタデータ インスタンスを 1 つだけ保持します。

更新: icafeは、RichTiffIPTC と Photoshop IRB の両方からの IPTC データを結合し、重複を削除できるようになりました。

Update2: ICAFEのすべてのメタデータ型の基本クラス - Metadata は Iterable インターフェイスを実装するようになったため、ユーザーは MetadataEntry のコレクションを反復処理できるようになりました。MetadataEntry 自体は複合パターンを使用して作成されるため、MetadataEntry には他の MetadataEntry のコレクションを含めることができます。各 MetadataEntry には、キーと値のペアが含まれています。この設計により、メタデータ エントリのツリー構造トラバーサルが可能になります。

于 2015-02-06T19:10:23.450 に答える
1

imageiolib を使用して IPTC here にアクセスする良い例がここにあります

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

残念ながら、一部の作業は自分で処理する必要があります。

于 2010-01-09T17:42:41.180 に答える
0

純粋な Java 実装が見つからない場合は、Java バインディングを ImageMagick ( JMagick ) に使用することを検討できます。これにより、さまざまな出力形式が可能になります。

于 2010-01-09T18:25:39.533 に答える