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

时间:2010-07-19 13:30:35

标签: delphi vcl

我有一个应用程序可以将文本和图像打印到打印机上的页面。在页脚,我们输出一个图像,通过加载一次缓存,并存储在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内容完全独立,并返回一个完整的(深层)副本,这样打印不会影响缓存版本,因此希望能解决这个问题。

德尔福2007如果相关。

2 个答案:

答案 0 :(得分:4)

我无法在此测试,因为我无法重现问题,但可能会在FreeImage之后立即致电Assign

答案 1 :(得分:0)

我使用SaveToStreamLoadToStream,可能使用TMemoryStream