掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
WICにて保存する場合のオプションの指定方法は? (ID:42639)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
WICにて保存する場合に、WICImage.SaveToFileで一応保存はできますが、 例えばJpegを保存する際に、Qualityを設定することができません。 そこで、以下のようにしてみたのですが、オプションの値がうまく 設定できません。 (何を指定しても標準値で保存されているようだ・・・) また、以下のソースを利用するとき、ランタイムテーマをオンにして OpenDialog等を使ってファイルを指定すると、終了時デバッガーで 例外が発生します・・・(^^; 何故? どなたかおわかりになる方がいらっしゃいましたら、ご教示お願いします。 implementation uses WinCodec, ActiveX; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var WICImage : TWICImage; Encoder : IWICBitmapEncoder; Frame : IWICBitmapFrameEncode; Props : IPropertyBag2; LStreamAdapter: TStreamAdapter; PixelFormat: TGUID; LStream : IWICStream; Palette : IWICPalette; Mem : TMemoryStream; Option : PPropBag2; Value : Variant; rtn : Integer; Factory : IWICImagingFactory; begin // イメージ読み込み WICImage := TWICImage.Create; WICImage.LoadFromFile('D:\test.bmp'); //出力先の作成(TMemoryStream) Mem := TMemoryStream.Create; Mem.Clear; LStreamAdapter := TStreamAdapter.Create(Mem); IUnknown(LStreamAdapter)._AddRef; try //WICImage.ImageFactoryを使うと何故か終了時異常終了するので・・・ if Failed(CoCreateInstance(CLSID_WICImagingFactory, nil, CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER, IUnknown, factory)) then exit; Factory.CreateStream(LStream); LStream.InitializeFromIStream(LStreamAdapter); //EncoderをJpeg形式用として作成 Factory.CreateEncoder(GUID_ContainerFormatJpeg, guid_null, Encoder); Encoder.Initialize(LStream, WICBitmapEncoderNoCache); // フレームを作成 Encoder.CreateNewFrame(Frame, Props); // Qualityを指定する new(Option); ZeroMemory(Option,Sizeof(TPropBag2)); Option.dwType := 1; Option.vt := VT_R4; Option.pstrName := 'ImageQuality'; Value := 0.1; // ここのProps.Writeが正常値を返さない・・・ rtn := Props.Write(1, Option, @Value); Dispose(Option); // 画像データに必要な情報を付加 Frame.Initialize(Props); WICImage.Handle.GetPixelFormat(PixelFormat); Frame.SetPixelFormat(PixelFormat); Frame.SetSize(WICImage.Width, WICImage.Height); Factory.CreatePalette(Palette); WICImage.Handle.CopyPalette(Palette); Frame.SetPalette(Palette); Frame.WriteSource(WICImage.Handle, nil); Frame.Commit; Encoder.Commit; // ファイルとして保存 Mem.Position := 0; Mem.SaveToFile('D:\test.jpg'); finally Mem.Free; IUnknown(LStreamAdapter)._Release; WICImage.Free; end; end;
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.