喫茶XRAYトップページ


[6107] TWICImage.SaveToStream返信 削除
2012/6/25 (月) 12:48:47 Sara
みなさん、こんにちは。

ちょっと、お知恵を拝借m(_ _)m

以下のような関数を書いて実行すると、大概は正常にイメージ変換しますが、

WICImage.SaveToStreamが失敗したときに、TStreamAdapterでメモリリークが
起きます。(WIC対応のActiveXなどを利用したときにまれに起きる)
これを回避する手立てを探しています。

おわかりになる方がいらっしゃいましたら、お願いいたします。

function WicSave:Boolean;
var WICImage : TWICImage;
    Mem : TMemoryStream;
begin
   Result := False;
   WICImage := TWICImage.Create;
   try
     Mem := TMemoryStream.Create;
     try
       Image.Bitmap.SaveToStream(Mem);
       Mem.Position := 0;
       WICImage.LoadFromStream(Mem);
     finally
       Mem.Free;
     end;
     WICImage.EncoderContainerFormat := 該当するフォーマットのGUID;
                                      //GUID_ContainerFormatWmpなど
     if not WICImage.Empty then begin
       Mem := TMemoryStream.Create;
       try
         try
           WICImage.SaveToStream(Mem);
           if Mem.Size > 0 then begin
             Mem.SaveToFile(ファイル名);
             Result := True;
           end;
         except

         end;
       finally
         Mem.Free;
       end;
     end;
   finally
     WICImage.Free;
   end;
end;

[6108] Re:TWICImage.SaveToStream返信 削除
2012/6/26 (火) 09:48:09 Sara
▼ Saraさん

みなさん、こんにちは。

 
> おわかりになる方がいらっしゃいましたら、お願いいたします。

http://blog.sina.com.cn/s/blog_8f0719470100zd39.html

に回答らしき物と言うか、回答そのものを見つけたので、
今夜にでも試してみます(^^;



[6109] Re2:TWICImage.SaveToStream返信 削除
2012/6/26 (火) 12:19:43 MrXRAY
▼ Saraさん

メモリリークが発生する状況を作成できないので,

> http://blog.sina.com.cn/s/blog_8f0719470100zd39.html

の修正コードだけをコピペしてやってみました.
usesにWincodec, ActiveXが必要でした.

procedure TForm1.Button3Click(Sender: TObject);
var
  WICImage : TWICImage2; //これ...
  Mem : TMemoryStream;
begin
  if not OpenDialog1.Execute then exit;

  WICImage := TWICImage2.Create;
  Mem := TMemoryStream.Create;
  try
      WICImage.LoadFromFile(OpenDialog1.FileName);
      WICImage.SaveToStream(Mem);
      Mem.Position := 0;
      Image1.Picture.Bitmap.LoadFromStream(Mem);
  finally
    Mem.free;
    WICImage.Free;
  end;
end;

[6110] Re3:TWICImage.SaveToStream返信 削除
2012/6/26 (火) 12:41:53 Sara
▼ MrXRAYさん

 
> メモリリークが発生する状況を作成できないので,
>
> > http://blog.sina.com.cn/s/blog_8f0719470100zd39.html
>
> の修正コードだけをコピペしてやってみました.
> usesにWincodec, ActiveXが必要でした.

ご苦労様でした。お手数をおかけします。(^^;

今、食事に帰ってきたので、やってみました。

無事メモリリークが収まりました。(^^)V

まず、Webを検索してから書き込むべきでした(^^;

では、また壁にぶち当たったら来ます(笑)

[6111] Re4:TWICImage.SaveToStream返信 削除
2012/6/26 (火) 12:56:35 MrXRAY
▼ Saraさん

> まず、Webを検索してから書き込むべきでした(^^;

いやいや,どんどん,こんなの書いてください.なんたって,喫茶店ですから (^^;
参考になります.
それにしても,よくも,あんな中国語のサイトを...
表示してビックリしてしまいました.

[6112] Re5:TWICImage.SaveToStream返信 削除
2012/6/26 (火) 13:25:53 Sara
▼ MrXRAYさん

>
> > まず、Webを検索してから書き込むべきでした(^^;
>
> いやいや,どんどん,こんなの書いてください.なんたって,喫茶店ですから (^^;
> 参考になります.
> それにしても,よくも,あんな中国語のサイトを...
> 表示してビックリしてしまいました.


大丈夫です。文字なんか読めなくたって、ソースさえ読めれば(笑)

まぁ、最近のIEは選択範囲をある程度翻訳してくれるので、それなりに
読めますが・・・

INCM/CMT
Cyclamen v3.82