private
public
procedure SaveToStream(Stream: TStream); override; //重写此方法,TWICImage的方法有问题。
End;
procedure TWICImage2.SaveToStream(Stream: TStream);
var
Encoder: IWICBitmapEncoder;
Frame: IWICBitmapFrameEncode;
Props: IPropertyBag2; //activeX
LStreamAdapter: TStreamAdapter;
PixelFormat: TGUID;
LStream: IWICStream;
Palette: IWICPalette;
//
FData2:TMemoryStream;//新定义一个流
begin
FData2:=TMemoryStream.Create;
//
FData2.Clear;
LStreamAdapter := TStreamAdapter.Create(FData2);
IUnknown(LStreamAdapter)._AddRef;
ImagingFactory.CreateStream(LStream);
LStream.InitializeFromIStream(LStreamAdapter);
ImagingFactory.CreateEncoder(EncoderContainerFormat, guid_null, Encoder);
Encoder.Initialize(LStream, WICBitmapEncoderNoCache);
Encoder.CreateNewFrame(Frame, Props);
Frame.Initialize(Props);
Handle.GetPixelFormat(PixelFormat);
Frame.SetPixelFormat(PixelFormat);
Frame.SetSize(GetWidth, GetHeight);
ImagingFactory.CreatePalette(Palette);
Handle.CopyPalette(Palette);
Frame.SetPalette(Palette);
Frame.WriteSource(Handle, nil);
Frame.Commit;
Encoder.Commit;
FData2.Position := 0;
Stream.CopyFrom(FData2, FData2.Size);
//
FData2.Free;
IUnknown(LStreamAdapter)._Release;//释放
end;