無劣化でのExif編集について
- 題名: 無劣化でのExif編集について
- 著者: あーる
- 日時: 2008/12/02 19:24:38
- ID: 23452
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[1]: 無劣化でのExif編集について
- 著者: きいよ
- 日時: 2008/12/03 22:01:23
- ID: 23455
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[2]: 無劣化でのExif編集について
- 著者: あーる
- 日時: 2008/12/04 12:51:55
- ID: 23459
- この記事の返信元:
- この記事への返信:
- ツリーを表示
分類:[その他]
自分なりに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に利用した旨を書けばいい程度のもの)があればそれも教えていただきたいです。
よろしくお願いします。