2010-07-19 64 views
3

我有一個應用程序可以將文本和圖像打印到打印機上的頁面。在頁腳處,我們輸出一個圖像,通過加載一次就可以緩存圖像,並存儲在TBitmap中。在打印例程中,它創建一個新的TBitmap,然後調用一個分配緩存位圖的函數。然後它會在該位圖上調用Canvas.StretchDraw。如何創建Delphi TBitmap的獨立副本?

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如果相關。

回答

4

我不能在這裏測試它,因爲我無法重現該問題,但也許Assign後立即FreeImage通話可能會有幫助。

+1

這解決了它。我查看了TBitmap的來源,從未真正看過。 「FreeImage」不是我期望的那樣!它「在精神上是自由的」,而不是「在記憶中自由」。 – mj2008 2010-07-19 14:11:23

+0

當打印+位圖有問題時,我已經學會了調用'FreeMemoryContexts'或'bmp.Handle'。純貨物崇拜節目,但它似乎工作很多時間。 – 2010-07-19 18:10:00

0

我會用SaveToStreamLoadToStream,可能與TMemoryStream

+0

這就是我所看到的。肯定會有效果。 – mj2008 2010-07-19 14:11:54