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))

这适用于前两张图片。之后抛出 OutOfMemoryException。我意识到图像的尺寸很大。但是,难道不能以某种方式进行覆盖并将它们放在某个地方吗?

即使我将第一次覆盖的结果保存到磁盘、释放内存并添加另一层,我仍然会遇到异常。

我应该如何解决这个问题?

乔斯普

4

2 回答 2

0

你需要第一个空位图吗?没有它,您只分配 3*200 MB 而不是 4*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

奇怪的是,在几个步骤中覆盖不起作用,我认为在这种情况下你没有正确释放内存。也许最好发布您用于这种方法的代码。

我还假设您确实需要其他地方的原始图像,或者确实想使用 C#/GDI+ 来执行此操作,因为使用某些图像编辑程序合并 PNG 文件非常容易。

于 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> 错误之一,它经常与内存无关。

于 2009-08-07T04:12:43.460 回答