私は、Windows Liveフォトギャラリーの動作と同様に、画像にタグを書き込む方法を研究してきました。私はいくつかの異なるライブラリ(metadata-extractor、jhead、jheader、sanselan)で遊んだことがありますが、Sanselanが必要なデータの書き戻しに対応できることを実際に見つけただけです。
私はApacheのWriteExifMetadataExampleに従ってTを実行しました。これは、GPSデータとApertureを更新するために問題なく機能しました。
次に、例を変更して、EXIF_TAG_XPKEYWORDS
ではなく更新しようとしましたEXIF_TAG_APERTURE_VALUE
。
上記のリンクの例では、TiffOutputField.create
行を次のように置き換えました。
String currentTagsAsString = new String((byte[]) jpegMetadata.findEXIFValue(ExifTagConstants.EXIF_TAG_XPKEYWORDS).getValue());
System.out.println("current tags: '" + currentTagsAsString + "'");
String newTag = "h e l l o";
String newTagsAsString = currentTagsAsString.trim() + " ; " + newTag + " ";
System.out.println("new desired tags: '" + newTagsAsString + "'");
TiffOutputField keywords = new TiffOutputField(ExifTagConstants.EXIF_TAG_XPKEYWORDS, FieldType.FIELD_TYPE_BYTE, newTagsAsString.length(), newTagsAsString.getBytes());
exifDirectory.removeField(ExifTagConstants.EXIF_TAG_XPKEYWORDS);
exifDirectory.add(keywords);
絞りとGPS更新コードをコメントアウトする以外は、残りはそのままにしておきました。バイト配列のフォーマットが少し混乱していることを認めますので、それが問題になる可能性があります。
警告/エラーなどは表示されません。プロセスは正常に完了しますが、新しいイメージファイルには更新されたタグが含まれていません。新しい画像に更新されたタグが含まれていないのはなぜですか?より簡単/より良い方法はありますか?
更新:代わりに1.0 RC commons-imaging APIで動作するようにコードを編集しましたが、結果は同じです。完全を期すために、ここで使用したコードを含めています
TiffImageMetadata metadata = toTiffMetadata(Imaging.getMetadata(inputFile));
System.out.println(metadata.getFieldValue(MicrosoftTagConstants.EXIF_TAG_XPKEYWORDS));
TiffOutputSet outputSet = metadata.getOutputSet();
TiffOutputDirectory exif = outputSet.getOrCreateExifDirectory();
exif.removeField(MicrosoftTagConstants.EXIF_TAG_XPKEYWORDS);
exif.add(MicrosoftTagConstants.EXIF_TAG_XPKEYWORDS, "helloworld;goodbye;");
writeFileWithNewTag(inputFile,destinationFile,outputSet);
新しいコードは、のようなものを使用するとうまく機能しますEXIF_TAG_XPAUTHOR
が、使用EXIF_TAG_XPKEYWORDS
してもエラーや警告、メッセージは一切生成されず、新しいファイルには新しいタグデータが含まれていません。