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;
環境を書いていませんでした・・・m(_ _)m
Delphi Xe2 + Windows7 Pro 64Bitです。
よろしくお願いいたします。
解決しました。
Option : TPropBag2;
Value : TPropVariant;
としておいて、
Option.pstrName := 'ImageQuality';
Value.vt := VT_R4;
Value.fltVal := 0.75; //0.00〜1.00
rtn := Props.Write(1, @Option, @Value);
とすると、正常に書き込みできて、Jpegの品質が変わりました。
(TPropVariantが探しきれていなかった・・・だけらしい・・・)
一応 報告まで。
解決チェック忘れてました・・・m(_ _)m
ツイート | ![]() |