3

私は、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してもエラーや警告、メッセージは一切生成されず、新しいファイルには新しいタグデータが含まれていません。

4

3 に答える 3

4

次のコードで XP キーワード タグを正常に追加しました。

private static void rewriteXpKeywords(String fileIn, String fileOut) throws Exception {
    TiffImageMetadata exif;
    IImageMetadata meta = Imaging.getMetadata(new File(fileIn));
    if (meta instanceof JpegImageMetadata) {
        exif = ((JpegImageMetadata)meta).getExif();
    } else if (meta instanceof TiffImageMetadata) {
        exif = (TiffImageMetadata)meta;
    } else {
        return;
    }
    TiffOutputSet outputSet = exif.getOutputSet();
    TiffOutputDirectory exifDir = outputSet.findDirectory(TiffDirectoryConstants.DIRECTORY_TYPE_EXIF);
    exifDir.removeField(AllTagConstants.EXIF_TAG_XPKEYWORDS);
    exifDir.add(AllTagConstants.EXIF_TAG_XPKEYWORDS, "helloworld;goodbye;");

    ExifRewriter rewriter = new ExifRewriter();
    FileOutputStream fos = null;
    try {
        fos = new FileOutputStream(new File(fileOut));
        rewriter.updateExifMetadataLossy(new File(fileIn), fos, outputSet);
    } finally {
        if (fos != null) {
            fos.close();
        }
    }
}

「データを変更」しないことをどのように知っていますか? 何で確認してるの?

于 2013-04-01T07:24:57.860 に答える
1

私は同じ問題を抱えており、解決策を得ました。以下のコードを試すことができます

public static TiffOutputField getTiffOutputFieldKeyword(
TiffOutputSet outputSet, String metaDataToChange) {
TiffOutputField imageHistoryPre = outputSet
    .findField(TiffConstants.EXIF_TAG_XPKEYWORDS);
 if (imageHistoryPre != null) {
outputSet.removeField(TiffConstants.EXIF_TAG_XPKEYWORDS);
 }

 TiffOutputField tiffOutputField = new TiffOutputField(
    TiffConstants.EXIF_TAG_XPKEYWORDS,
    TiffFieldTypeConstants.FIELD_TYPE_BYTE,
    metaDataToChange.getBytes("UTF-16").length, metaDataToChange.getBytes("UTF-16"));

return tiffOutputField;
}

XPKeywords を Exif に書く

于 2014-09-03T07:53:50.877 に答える