用GDI +覆盖图像

时间:2009-08-06 15:19:00

标签: gdi+ overlay

我正在尝试使用其他几个图像叠加图像。我使用这段代码来做到这一点:

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。 我意识到图像的大小很大。 但是不是以某种方式可以做覆盖并在某处进行切割吗?

即使我将第一个叠加的结果保存到磁盘,释放内存,并添加另一个层,我仍然会得到异常。

我该如何解决这个问题?

JosP

2 个答案:

答案 0 :(得分: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文件非常容易。

答案 1 :(得分: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异常似乎是< sarcasm>极其有用的< / sarcasm>之一。 GDI抛出的错误经常与内存无关。