我有一个应用程序可以将文本和图像打印到打印机上的页面。在页脚,我们输出一个图像,通过加载一次缓存,并存储在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如果相关。
答案 0 :(得分:4)
我无法在此测试,因为我无法重现问题,但可能会在FreeImage
之后立即致电Assign
。
答案 1 :(得分:0)
我使用SaveToStream
和LoadToStream
,可能使用TMemoryStream
。