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

标签 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 内容完全独立,并返回完整的(深层)副本,以便打印不会影响缓存的版本,从而希望解决此问题。

Delphi 2007(如果相关)。

最佳答案

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

关于delphi - 如何创建 Delphi TBitmap 的独立副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3281469/

相关文章:

delphi - 求平面图设计VCL工具栏

delphi - GDI+ 在 TBitmap 上绘图

Delphi - 窗体中的窗体

delphi - 修复 Delphi XE3 中的 VCL 样式目录

delphi - TGM map 访问被拒绝

delphi - 当我重新排列 TObjectList 时,为什么会收到 "invalid pointer operation"?

delphi - Delphi VCL组件的 'Tag'属性的用途是什么?

c++ - 在 C++Builder XE7 中使用 TChart

multithreading - (Delphi 2009) idIRC、MDI 和挂起问题

delphi - TDBGrid 选定的行索引 : How to get