TWICImage中的LoadFromStream重写,主要是要释放LStream := TStreamAdapter.Create(FData);这句话,该如何处理
TWICImage中的LoadFromStream重写,主要是要释放LStream := TStreamAdapter.Create(FData);这句话
procedure TWICImage.LoadFromStream(Stream: TStream);
var
LStream: TStreamAdapter;
BitmapDecoder: IWICBitmapDecoder;
LBitmapFrame: IWICBitmapFrameDecode;
LGUID: TGUID;
procedure WicCheck(Result: HRESULT);
begin
if Failed(Result) then
raise EInvalidGraphic.Create(SInvalidImage);
end;
begin
FreeAndNil(FBitmap);
FData.Clear;
FData.CopyFrom(Stream, Stream.Size - Stream.Position);
FData.Position := 0;
LStream := TStreamAdapter.Create(FData); // 要把这个函数的变量释放掉,它导致内存泄露,烦死了
WicCheck(FImagingFactory.CreateDecoderFromStream(LStream, guid_null, WICDecodeMetadataCacheOnDemand, BitmapDecoder));
WicCheck(BitmapDecoder.GetContainerFormat(LGUID));
EncoderContainerFormat := LGUID;
WicCheck(BitmapDecoder.GetFrame(0, LBitmapFrame));
WicCheck(FImagingFactory.CreateBitmapFromSource(LBitmapFrame, WICBitmapCacheOnLoad, FWicBitmap));
WicCheck(FWicBitmap.GetSize(FWidth, FHeight));
FFormatChanged := False;
end;
------解决方案--------------------
直接改源代码不得??
procedure TWICImage.LoadFromStream(Stream: TStream);
var
LStream: TStreamAdapter;
BitmapDecoder: IWICBitmapDecoder;
LBitmapFrame: IWICBitmapFrameDecode;
LGUID: TGUID;
procedure WicCheck(Result: HRESULT);
begin
if Failed(Result) then
raise EInvalidGraphic.Create(SInvalidImage);
end;
begin
FreeAndNil(FBitmap);
FData.Clear;
FData.CopyFrom(Stream, Stream.Size - Stream.Position);
FData.Position := 0;
LStream := TStreamAdapter.Create(FData); // 要把这个函数的变量释放掉,它导致内存泄露,烦死了
WicCheck(FImagingFactory.CreateDecoderFromStream(LStream, guid_null, WICDecodeMetadataCacheOnDemand, BitmapDecoder));
WicCheck(BitmapDecoder.GetContainerFormat(LGUID));
EncoderContainerFormat := LGUID;
WicCheck(BitmapDecoder.GetFrame(0, LBitmapFrame));
WicCheck(FImagingFactory.CreateBitmapFromSource(LBitmapFrame, WICBitmapCacheOnLoad, FWicBitmap));
WicCheck(FWicBitmap.GetSize(FWidth, FHeight));
FFormatChanged := False;
end;
------解决方案--------------------
直接改源代码不得??