为什么System.Drawing.Graphics.GetHdc()会增加内存使用量

时间:2013-02-28 10:05:17

标签: .net vb.net winapi gdi device-context

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(我的图像的具体绘图表面的优化副本),我的绘图如何从该优化副本回到原始的“backbuffer”Bitmap?

1 个答案:

答案 0 :(得分:0)

我认为这是因为当您创建位图类的新实例然后g.hdc()强制它创建相当于您所述页面大小的新位图文件,因此这些内存使用峰值不会异常你不应该担心它们。

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