我有一个应用程序,可以将文本和图像打印到打印机的页面上。在页脚处,我们输出一张图片,它通过一次加载被缓存,并存储在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。
FreeMemoryContexts
或bmp.Handle
。这是一种纯粹的蒟蒻编程方式,但它似乎在很多情况下都能起作用。 - Uli Gerhardt