代码之家  ›  专栏  ›  技术社区  ›  jos

用gdi覆盖图像+

  •  0
  • jos  · 技术社区  · 16 年前

    我正在尝试用其他一些图像覆盖一个图像。我用这个代码来做这个:

    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。 我知道图像的尺寸很大。 但不知何故,是否有可能在某个地方做覆盖并切掉它们?

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

    我应该如何处理这个问题?

    约瑟普

    2 回复  |  直到 16 年前
        1
  •  0
  •   Kris Erickson    16 年前

    不知道这是否真的是问题所在,但您没有处理正在位图上绘制的图像。这有帮助吗?

    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倍的图片。此外,内存不足错误异常似乎是GDI经常抛出的与内存无关的非常有用的错误之一。

        2
  •  0
  •   schnaader    16 年前

    是否需要第一个空位图?如果没有它,您只分配了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文件非常容易。