如何创建一个独立的Delphi TBitmap副本?

4

我有一个应用程序,可以将文本和图像打印到打印机的页面上。在页脚处,我们输出一张图片,它通过一次加载被缓存,并存储在TBitmap中。在打印例程中,它创建一个新的TBitmap,然后调用一个函数来分配缓存的位图。然后它最终调用Canvas.StretchDraw来绘制该位图。

Function GetFooterGraphic(Var xBitmap : TBitmap) : boolean;
begin
  // load cache here
  if assigned(g_xFooterBitmap) then
  begin
    xBitmap.Assign(g_xFooterBitmap);
    result := true;
  end;
end

// Get bitmap, then:
xCanvas.StretchDraw(xDrawRect, xBitmap);

问题是在某些页面后位图无法正常工作。我只能想象这是驱动程序问题,但它在大多数打印机上不同时间发生。我可以通过每次重新加载位图来解决它,但我更愿意保留缓存。
查看了VCL后,xBitmap.Assign实际上只是添加到存储项的引用。我想要做的是完全复制,最有效的方法是什么?因此提出了以下问题:
如何使TBitmap内容完全独立于任何其他引用? 我希望保持缓存的TBitmap内容完全独立,并返回一个完整(深层)副本,以便打印不会影响缓存版本,从而希望解决此问题。
如果相关,Delphi 2007。
2个回答

5

我不能在这里测试它,因为我无法重现这个问题,但也许在Assign之后立即调用FreeImage可能会有所帮助。


2
这样解决了。我查看了TBitmap的源代码,但从未真正注意到这一点。“FreeImage”不是我所期望的!它是“自由精神”,而不是“自由内存”。 - mj2008
当遇到打印位图的问题时,我学会了调用 FreeMemoryContextsbmp.Handle。这是一种纯粹的蒟蒻编程方式,但它似乎在很多情况下都能起作用。 - Uli Gerhardt

0
我会使用SaveToStreamLoadToStream,可能会用到TMemoryStream

那正是我想要做的。肯定会奏效的。 - mj2008

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接