WICにて保存する場合のオプションの指定方法は?

解決


Sara  2012-07-21 03:59:31  No: 42639

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;


Sara  2012-07-21 04:01:36  No: 42640

環境を書いていませんでした・・・m(_ _)m

Delphi Xe2 + Windows7 Pro 64Bitです。

よろしくお願いいたします。


Sara  2012-07-24 19:27:59  No: 42641

解決しました。

  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が探しきれていなかった・・・だけらしい・・・)

一応 報告まで。


Sara  2012-07-24 19:32:34  No: 42642

解決チェック忘れてました・・・m(_ _)m


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加