Pregunta

Estoy tratando de superponer una imagen con un par de otras imágenes. Yo uso este código para hacer lo siguiente:

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

Esto funciona con las dos primeras imágenes. Después de que se produce una OutOfMemoryException. Me di cuenta el tamaño de las imágenes son grandes. Pero no es posible de alguna manera para hacer las superposiciones y Chache ellos en alguna parte?

Incluso si ahorro el resultado de la primera plantilla en disco, memoria libre, y añadir otra capa sigo teniendo la excepción.

¿Cómo debería abordar este problema?

JOSP

¿Fue útil?

Solución

No sé si este es realmente el problema, pero no se están disponiendo de las imágenes que se dibuja en el mapa de bits. ¿Ayuda esto?

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

Me serias dudas de que tenga nada que ver con las imágenes, ya que he trabajado con imágenes 2-3 veces ese tamaño sin ese problema. También excepción OutOfMemoryError parece ser uno de los extremadamente útil errores que GDI tiros que con frecuencia no tiene nada que ver con la memoria.

Otros consejos

¿Necesita el primer mapa de bits vacío? Sin ella, se puede asignar sólo 3 * 200 MB en lugar de 4 * 200 MB, tal vez esto funcionará:

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

Es extraño que la superposición de varios pasos no funciona, creo que usted no está liberando memoria correctamente en este caso. Tal vez será mejor que se publique el código que está utilizando para este enfoque.

También supongo que usted no necesita las imágenes originales en otro lugar o no desea específicamente para hacer esto usando C # / GDI +, ya que sería muy fácil de combinar los archivos PNG usando algunos programas de edición de imágenes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top