наложение изображений с помощью GDI + - PullRequest
0 голосов
/ 06 августа 2009

Я пытаюсь наложить изображение на пару других изображений. Я использую этот код для этого:

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 голосов
/ 07 августа 2009

Не знаю, действительно ли это проблема, но вы не избавляетесь от изображений, которые вы рисуете на растровом изображении. Это помогает?

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, которые часто не имеют ничего общего с памятью.

0 голосов
/ 06 августа 2009

Вам нужен первый пустой растровый рисунок? Без этого вы выделяете только 3 * 200 МБ вместо 4 * 200 МБ, возможно, это будет работать:

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 с помощью некоторых программ для редактирования изображений.

...