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

此函数将图像绘制到从函数返回的位图类型变量“backbuffer”的 hdc 中。但是我对这个函数中内存的两次大增加(我的图像很大)不满意:
在行

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

并在线

Dim hdc As IntPtr = g.GetHdc()

所以,我有一个问题:
为什么第二行会增加与我的图像等效大小的内存,
为什么如果我绘制到 hdc 中,我会得到绘制的位图,然后返回(可能首先是装箱,然后是正在拆箱)?

如果我绘制到 hdc(针对具体绘图表面的图像的优化副本),我的绘图如何从该优化副本恢复到原始的“后缓冲”位图?

4

1 回答 1

0

我认为这是因为当您创建位图类的新实例然后 g.hdc() 强制它创建与您声明的页面大小相等的新位图文件时,因此这些内存使用高峰不是异常的,您应该不用担心他们。

还要确保在函数末尾处理后缓冲变量,以确保释放该对象使用的所有内存。

于 2013-03-07T18:22:34.713 回答