0

画像を他のいくつかの画像と重ね合わせようとしています。私はそれを行うためにこのコードを使用します:

Dim gbkn As Bitmap = New Bitmap(7001, 7001, Imaging.PixelFormat.Format32bppArgb)
Dim g As Graphics = Graphics.FromImage(CType(gbkn, Image))
g.DrawImage(Image.FromFile("C:\background.png"), New Point(0, 0))
g.DrawImage(Image.FromFile("C:\firstlayer.png"), New Point(0, 0))
g.DrawImage(Image.FromFile("C:\secondlayer.png"), New Point(0, 0))

これは、最初の 2 つの画像で機能します。その後、OutOfMemoryException がスローされます。画像のサイズが大きいことに気づきました。しかし、オーバーレイを実行してどこかにキャッシュすることは何とか可能ではないでしょうか?

最初のオーバーレイの結果をディスクに保存し、メモリを解放し、別のレイヤーを追加しても、例外が発生します。

この問題にどのようにアプローチすればよいですか?

ヨスプ

4

2 に答える 2

0

最初の空のビットマップが必要ですか? それがなければ、4*200 MB ではなく 3*200 MB だけを割り当てます。おそらくこれでうまくいくでしょう:

Dim g As Graphics = Graphics.FromImage("C:\background.png")
g.DrawImage(Image.FromFile("C:\firstlayer.png"), New Point(0, 0))
// and so on

いくつかのステップでオーバーレイが機能しないのは奇妙です。この場合、メモリを正しく解放していないと思います。おそらく、このアプローチに使用しているコードを投稿する方がよいでしょう。

また、いくつかの画像編集プログラムを使用して PNG ファイルをマージするのは非常に簡単であるため、元の画像が別の場所に必要であるか、C#/GDI+ を使用して特にこれを行いたいと考えています。

于 2009-08-06T15:33:53.997 に答える
0

これが実際に問題かどうかはわかりませんが、ビットマップに描画している画像を破棄していません。これは役に立ちますか?

Dim gbkn As Bitmap = New Bitmap(7001, 7001, Imaging.PixelFormat.Format32bppArgb)
Dim g As Graphics = Graphics.FromImage(CType(gbkn, Image))
Dim img As Image = Image.FromFile("C:\background.png")
g.DrawImage(img, New Point(0, 0))
img.Dipose()
img As Image = Image.FromFile("C:\firstlayer.png")
g.DrawImage(img, New Point(0, 0))
img.Dispose()
img As Image = Image.FromFile("C:\secondlayer.png")
g.DrawImage(Image.FromFile("C:\secondlayer.png"), New Point(0, 0))
img.Dispose()

問題なくそのサイズの2〜3倍の画像で作業したので、画像とは何の関係もないと真剣に疑っています。また、OutOfMemoryError 例外は、GDI が頻繁にスローする <sarcasm>非常に役立つ</sarcasm> エラーの 1 つで、メモリとは関係がないようです。

于 2009-08-07T04:12:43.460 に答える