1

Exiv2 ライブラリを使用していくつかの exif タグを画像に書き込みます。Exiv2 サイトで提供されている例と同様に、以下のコードを実行しています。

ただし、エラーをスローするものもあれば、単に書き込みをしないだけでエラーをスローしないものもあります。Exif.Image.* のタグは機能せず、Exif.Photo.* のタグは機能し、機能しないものもありますが、パターンが見つかりません。

JHEAD を使用して、ファイルに書き込まれた内容を確認しています。

誰かが過去にこの行動に出くわしたり、何が起こっているのか知っているのだろうか? ありがとう。

Exiv2::ExifData exifData;

try {

 // these work fine
 exifData["Exif.Photo.FNumber"] = Exiv2::Rational(7, 5); 
 exifData["Exif.Photo.ExposureTime"] = Exiv2::Rational(1, 1);
 exifData["Exif.Photo.WhiteBalance"] = uint16_t(1);
 exifData["Exif.Photo.ShutterSpeedValue"] = Exiv2::Rational(1, 1);
 exifData["Exif.Photo.DateTimeOriginal"] = "12:12:12";

 // throw errors
 exifData["Exif.Photo.ISOSpeed"] = int32_t(2); 

 // don't throw error, but don't write to jpg
 exifData["Exif.Photo.GainControl"] = uint16_t(0);
 exifData["Exif.Photo.Saturation"] = uint16_t(100);
 exifData["Exif.Photo.Sharpness"] = uint16_t(2);

Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open("filepath");
assert(image.get() != 0);

image->setExifData(exifData);
image->writeMetadata();

}
catch (Exiv2::AnyError& e) {
cout << "Caught Exiv2 exception '" << e << "'\n";
}
4

1 に答える 1

0

JPEG 画像と TIFF 画像の両方でこのコードを実行すると、説明されている問題を再現できません。例外はスローされず、すべてのタグがイメージに書き込まれます。

ただし、Exiv2 が特定のタグを黙って書き込まないことは事実です。これは、ターゲット画像が TIFF のような画像である場合に発生しますが、JPEG では発生しません。無視されるタグは、Exiv2 が画像自体の整合性に関連すると見なす TIFF「画像タグ」です。これは、TIFF のような画像の構造では、画像タグとメタデータが共存するためです。これらの画像タグはすべて「画像」グループ (Exif.Image.*) からのもので、例として Exif.Image.ImageWidth があります。

上記の動作をトリガーする再現ツール (または上記のコードに加えてターゲット イメージ) を提供できる場合は、dev.exiv2.org の Exiv2 バグトラッカーで問題として報告してください。

アンドレアス

于 2012-07-30T07:40:28.697 に答える