• TWICImage.SaveToStream内存泄漏的解决办法


    这个BUG从2010到XE5一直没改.....只能自己写个函数来搞了

    uses
        ActiveX;
    
    procedure WICImageSaveToStream(AWICImage: TWICImage; AStream: TStream);
    var
      nEncoder: IWICBitmapEncoder;
      nFrame: IWICBitmapFrameEncode;
      nProps: IPropertyBag2;
      nLStreamAdapter: TStreamAdapter;
      nPixelFormat: TGUID;
      nLStream: IWICStream;
      nPalette: IWICPalette;
      nData: TMemoryStream;
    begin
      nData:=TMemoryStream.Create;
      nLStreamAdapter := TStreamAdapter.Create(nData);
      IUnknown(nLStreamAdapter)._AddRef;
      try
        nData.Clear;
        AWICImage.ImagingFactory.CreateStream(nLStream);
        nLStream.InitializeFromIStream(nLStreamAdapter);
        AWICImage.ImagingFactory.CreateEncoder(AWICImage.EncoderContainerFormat, guid_null, nEncoder);
        nEncoder.Initialize(nLStream, WICBitmapEncoderNoCache);
        nEncoder.CreateNewFrame(nFrame, nProps);
        nFrame.Initialize(nProps);
        AWICImage.Handle.GetPixelFormat(nPixelFormat);
        nFrame.SetPixelFormat(nPixelFormat);
        nFrame.SetSize(AWICImage.Width, AWICImage.Height);
        AWICImage.ImagingFactory.CreatePalette(nPalette);
        AWICImage.Handle.CopyPalette(nPalette);
        nFrame.SetPalette(nPalette);
        nFrame.WriteSource(AWICImage.Handle, nil);
        nFrame.Commit;
        nEncoder.Commit;
        nData.Position := 0;
        AStream.CopyFrom(nData, nData.Size);
      finally
        IUnknown(nLStreamAdapter)._Release; {相对于VCL代码 , 这里要释放}
        nData.Free;
      end;
    end;
  • 相关阅读:
    nginx启动,停止,重启
    获取节点与属性
    修改节点的属性 节点默认不允许修改
    删除节点与属性
    创建属性Attribute
    新增节点NewBook并增加属性Name="WPF"
    创建xml树
    HashTable Queue Stack SortedList BitArray
    ArrayList详细
    sqlserver 优化
  • 原文地址:https://www.cnblogs.com/lzl_17948876/p/3327878.html
Copyright © 2020-2023  润新知