2013-02-28 113 views
2
Public Shared Function Render(ByRef pdfDoc As PDFLibNet.PDFWrapper) As System.Drawing.Bitmap 
    Try 
     If pdfDoc IsNot Nothing Then 
      Dim PW As Integer = pdfDoc.PageWidth 
      Dim PH As Integer = pdfDoc.PageHeight 
      Dim backbuffer As System.Drawing.Bitmap = New Bitmap(PW, PH) 
      pdfDoc.ClientBounds = New Rectangle(0, 0, pdfDoc.PageWidth, pdfDoc.PageHeight) 
      Dim g As Graphics = Graphics.FromImage(backbuffer) 
      Using g 
       Dim hdc As IntPtr = g.GetHdc() 
       pdfDoc.DrawPageHDC(hdc) 
       g.ReleaseHdc() 
      End Using 
      g.Dispose() 
      Return backbuffer 
     End If 
    Catch ex As Exception 
     Throw ex 
     Return Nothing 
    End Try 
    Return Nothing 
End Function 

該函數繪製圖像入變量類型位圖,從功能返回的「後備緩衝區」的HDC。但我的兩個內存的大幅增長感到不滿(我的形象是很大的)這個函數:
在行爲什麼System.Drawing.Graphics.GetHdc()增加內存使用

Dim backbuffer As System.Drawing.Bitmap = New Bitmap(PW, PH) 

,並在線路

Dim hdc As IntPtr = g.GetHdc() 

所以,我有一個問題:
爲什麼第二行增加了一個與我的圖像大小相當的內存大小,以及爲什麼如果我繪製到hdc中,我得到了繪製的位圖,我返回了(也許第一個是裝箱,第二個是拆箱)?

如果我繪製到hdc(具體繪圖表面的圖像的優化副本),我的繪圖如何從該優化副本回到原始「backbuffer」位圖?

+1

你爲什麼處理g以及它在using()中? – 2013-02-28 10:08:45

+0

但你期望什麼? HDC實際上是一種針對混凝土繪圖表面優化的位圖。它的大小等於該表面的大小。 – 2013-02-28 10:16:36

+0

謝謝!如果我繪製成hdc,我的繪圖如何回到原始的「backbuffer」位圖上? – 2013-02-28 10:34:44

回答

0

我認爲這是因爲當你創建位圖類的新實例,然後g.hdc()強制它創建新的位圖文件等效於你所指定頁面的大小,所以這些內存使用率峯值不是異常,你不應該擔心他們。

還要確保在函數的末尾放置back-buffer變量,以確保釋放該對象使用的所有內存。

相關問題