Exif情報の編集

[戻る]
momo 2007/03/14(水) 21:41:55
Exif情報の一つで、撮影日時を任意に編集するようにしたいのですが、
下記のようにコーディングしたのですが、メモリー上では更新されるのですが、
ファイルには反映されません。別ファイルとして保存すれば反映されるのですが、
どうしたらよいでしょうか?

CHAR Value[] = "2007:03:14 21:40:00";

Image * pImage = Image::FromFile(FilePath.AllocSysString());

pImage->RemovePropertyItem(PropertyTagExifDTOrig);

PropertyItem* propertyItem = new PropertyItem;

propertyItem->id = PropertyTagExifDTOrig;
propertyItem->length = 20;
propertyItem->type = PropertyTagTypeASCII; 
propertyItem->value = Value;
pImage->SetPropertyItem(propertyItem);

delete propertyItem;

subaru 2007/03/15(木) 14:49:30
Exif情報を変えるだけなら保存しても画質は変わらないので
上書きしてしまってもよいのではないでしょうか。

momo 2007/03/15(木) 16:50:02
subaruさん、お返事ありがとうございます。

別ファイルに保存する方法はわかるのですが、
上書きするにはどのようにしたらよいでしょうか?

教えて下さい。

subaru 2007/03/15(木) 17:28:25
>別ファイルに保存する方法はわかるのですが、
>上書きするにはどのようにしたらよいでしょうか?

そういえばImage::FromFileで読み込んだ場合はオブジェクトが
破棄されるまでファイルがロックされてしまうのでした。
ちょっとめんどうですが、入力ファイルを一旦IStreamに読み込んで
Image::FromStreamを使用してオブジェクトを作成するように
してみてください。

momo 2007/03/15(木) 23:39:39
Streamに読み込んで、

GetEncoderClsid(L"image/jpeg", &encoderClsid);
pImage->Save(FilePath.AllocSysString(), &encoderClsid);

上記のようにして上書きし、Exifを編集することができました。

しかし、ファイルサイズが若干小さくなっていたのですが、
やはり、画像の劣化が発生したのでしょうか?

ディスク上のサイズは同じなのですが...

サイズ:2,877,748 バイト→2,877,706 バイト
ディスク上のサイズ:2,879,488 バイト→2,879,488 バイト

ぬふや 2007/03/16(金) 20:57:19
そのぐらいの変化でしたらむしろ、
・操作しなかったほかの情報が削除されたとか、
・元ファイルに有ったパティングが削除されたとか、
・データの格納形式が変更されたとか、
・元ファイルの終端にJpegとは関係の無いゴミデータが付いていたとか、
だと思いますが。

負荷逆なので、出力したファイルをもう一度入力に使ってもサイズが変化するよう
なら劣化してるかも知れません。
バイナリエディタで見てみるってのも一つの手だと思いますが…Jpegだと無意味か
も知れないですね。

それと、ディスク上のサイズは普通関係しませんので省いてもかまいませんよ。

momo 2007/03/17(土) 23:35:56
[[解決]]
ぬふやさん、ご回答ありがとうございました。

2回目以降は、データサイズに変化はありませんでした。
やはり、ごみ的なデータが削除された可能性が高いと思います。
とっても参考になりました。ありがとうございました。

古いスレッドには追加発言できません。