DOBON.NET DOBON.NETプログラミング掲示板過去ログ

無劣化でのExif編集について

環境/言語:[WindowsXP C++ (C#でも可)]
分類:[その他]

自分なりに2日ほど調べてはみたのですが、分からなかったので質問させてください。
C++でjpeg画像に品質を劣化させずExif情報を書き込むプログラムを作成中です。
以下のようなコードで、実際にExif情報を書き込むことができました。

GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

Image* pImgOrg = Image::FromFile ( L"temp.jpg");

Bitmap* pBitmap = new Bitmap ( 3296, 2472 );

Graphics* pGrfx = Graphics::FromImage ( pBitmap );

Gdiplus::Rect rectDist ( 0, 0, 3296, 2472);

pGrfx->DrawImage (
pImgOrg,
rectDist,
0, 0, pImgOrg->GetWidth (), pImgOrg->GetHeight (),
UnitPixel);
delete pImgOrg;

pBitmap->RemovePropertyItem(PropertyTagDateTime);
pBitmap->RemovePropertyItem(PropertyTagExifDTOrig);
pBitmap->RemovePropertyItem(PropertyTagExifDTDigitized);

PropertyItem* propertyItem = new PropertyItem;

CHAR Value[] = "2007:03:14 21:40:00";
propertyItem->id = PropertyTagExifDTOrig;
propertyItem->length = 20;
propertyItem->type = PropertyTagTypeASCII;
propertyItem->value = Value;

CLSID encoderClsid;
GetEncoderClsid(L"image/jpeg", &encoderClsid);

EncoderParameters encoderParameters;
encoderParameters.Count = 1;
encoderParameters.Parameter[0].Guid = EncoderQuality;
encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;
encoderParameters.Parameter[0].NumberOfValues = 1;

long quality = 80;
encoderParameters.Parameter[0].Value = &quality;

pBitmap->Save( L"temp.jpg", &encoderClsid, NULL);

ただこの方法はjpegからbmpに変換して再保存する形なので、当然ですが劣化してしまいます。
しかし、PropertyItemを利用するには一度Imageとして展開しなければならないように見えます。
画像からExif部分のみを取り出して、その部分だけを更新して書き込む方法は、
画像を直接バイト列として扱ってExif情報も自分で解釈して該当部分だけ直接書き込む形しかないのでしょうか?
その場合、Exif情報が存在しないjpegファイルに書き込むには、
自分でゼロからExif情報を生成して書き込まないといけないのでしょうか?

今私はC++で書いていますが、解決できるのであればC#でもかまいません。
また、既存のライブラリを利用することも考えてはいますが、
GPLライセンスのものしか見つけられませんでした。
GPLではなくゆるいライセンス(READMEに利用した旨を書けばいい程度のもの)があればそれも教えていただきたいです。
よろしくお願いします。
あーるさん

本Tips「画像のExif情報を取得する、設定する」
http://dobon.net/vb/dotnet/graphics/getexifinfo.html

C#ですが、
でSAVEしたりしても画像が劣化はしていないと思われますが。
(ファイルサイズ等も変化ありませんし。)

劣化とはどのように調べられていますか?
きいよさん

どうもありがとうございます。
私の試した方法ではファイルサイズが半分以下になってしまったので劣化したと思いました。
ここのサイトのこのTipsも拝見したのですが、
その時も半分以下になったと思ったのですが、私の勘違いだったようです。
今試してみたらきちんと保存することができました。
お手数おかけして申し訳ありませんでした(´・ω・`)
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板