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 に画像を描画します。
しかし、私はこの関数で2つの大きなメモリの増加に不満を持っています(私のイメージは大きいです):

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

そして行で

Dim hdc As IntPtr = g.GetHdc()

だから、私は質問があります:
なぜ 2 行目は私の画像のサイズに相当するサイズのメモリを増やすの
か、なぜ hdc に描画すると、描画されたビットマップを取得するのか (おそらく最初にボクシングがあり、2 番目にそこにあります)は開封済みです) ?

そして、hdc (具体的な描画面用に最適化された画像のコピー) に描画すると、その最適化されたコピーから元の「バックバッファー」ビットマップに描画がどのように戻ったのでしょうか?

4

1 に答える 1

0

これは、ビットマップクラスの新しいインスタンスを作成してから、g.hdc()によって、ページに指定したサイズと同じサイズの新しいビットマップファイルが強制的に作成されるためです。したがって、これらのメモリ使用量の急増は異常ではなく、それらについて心配する必要はありません。

また、関数の最後にバックバッファ変数を配置して、そのオブジェクトによって使用されているすべてのメモリが解放されるようにしてください。

于 2013-03-07T18:22:34.713 に答える