Java を使用した tif ファイルからの IPTC/EXIF データの抽出
-
13-09-2019 - |
質問
私が取り組んでいるシステムには、JPEG ファイルからメタデータを抽出する機能があります。 com.drew.metadata
パッケージ。 http://www.drewnoakes.com/code/exif/ ただし、これは JPEG ファイルに限定されており、お客様から TIF やおそらく他の画像形式から IPTC を抽出することについて問い合わせがありました。
TIF から IPTC を抽出できる、Drew Noakes の API と同様の API について知っている人はいますか?
理想的には、これは次のような純粋な Java アプローチになります。 com.drew.metadata
1つ。
解決
この古い質問です。今日で私のmetadata-extractor
ライブラリは、同様にJPEG、WEBP、PSD、PNG、GIF、BMP、ICO、PCX、多くのCamera Raw形式として、TIFFファイルをサポートしています。
最近のGitHubに移動し、プロジェクトます:
https://github.com/drewnoakes/metadata-extractorする
とMavenを経由して提供されています:
他のヒント
最近、メタデータ操作部分のコーディングに時間を費やしました。 アイカフェ 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 は 1 つの IPTC データのみを保持します。IPTC データを含む Photoshop タグと RichTiffIPTC タグの両方が存在する場合、RichTiffIPTC データが保持されます。それ以外の場合は、どのタグが存在しても、そのタグからの IPTC データが保持されます。両方の場所からデータを保持しても問題ありません。現在の実装では、メタデータ タイプのキーを一意のメタデータにマッピングするマップを使用しています。したがって、一意のメタデータ インスタンスを 1 つだけ保持します。
アップデート: アイカフェ RichTiffIPTC と Photoshop IRB の両方からの IPTC データを結合し、重複を削除できるようになりました。
アップデート2: ICAFE のすべてのメタデータ タイプの基本クラス - Metadata は Iterable インターフェイスを実装するようになり、ユーザーは MetadataEntry のコレクションを反復処理できるようになりました。MetadataEntry 自体は複合パターンを使用して作成されるため、MetadataEntry には他の MetadataEntry のコレクションを含めることができます。各 MetadataEntry にはキーと値のペアが含まれます。この設計により、メタデータ エントリのツリー構造の横断が可能になります。
ここ
IPTCにアクセスするためにimageio
libにを使用してのここで良い例があります
のhttp:// WWW .barregren.se /ブログ/どのように読み-EXIF-と-IPTC-javaの-画像-IO-API の
残念ながら、あなたはまだ仕事を自分の一部を処理する必要があります。
あなたは純粋なJavaの実装を見つけることができない場合は、ImageMagickのにJavaバインディング( JMagick <を使用して検討することもでき/ A>)。これは、異なる可能な出力形式の過多が可能になる。