C # Image.Clone Excepción de memoria

¿Por qué recibo una excepción de falta de memoria?

Así que esto muere en C # por primera vez a través de:

splitBitmaps.Add (neededImage.Clone (rectDimensions, neededImage.PixelFormat));

Donde splitBitmaps es una Lista PERO esto funciona en VB durante al menos 4 iteraciones:

arlSplitBitmaps.Add (Image.Clone (rectDimensions, Image.PixelFormat))

Donde arlSplitBitmaps es una lista de matriz simple. (Y sí, he intentado la lista de arrays en c #)

Esta es la sección completa:

for (Int32 splitIndex = 0; splitIndex <= numberOfResultingImages - 1; splitIndex++) { Rectangle rectDimensions; if (splitIndex < numberOfResultingImages - 1) { rectDimensions = new Rectangle(splitImageWidth * splitIndex, 0, splitImageWidth, splitImageHeight); } else { rectDimensions = new Rectangle(splitImageWidth * splitIndex, 0, sourceImageWidth - (splitImageWidth * splitIndex), splitImageHeight); } splitBitmaps.Add(neededImage.Clone(rectDimensions, neededImage.PixelFormat)); 

}

neededImage es un bitmap por cierto.

No puedo encontrar ninguna respuesta útil en el intarweb, especialmente no por qué funciona bien en VB.

Actualizar:

De hecho, encontré una razón (más o menos) para este funcionamiento, pero olvidé publicarlo. Tiene que ver con la conversión de la imagen a un bitmap en lugar de solo intentar clonar la imagen sin procesar si mal no recuerdo.

Clone () también puede lanzar una excepción de falta de memoria cuando las coordenadas especificadas en el rectángulo están fuera de los límites del bitmap. No los recortará automáticamente.

Descubrí que estaba usando Image.Clone para recortar un bitmap y el ancho tomó el recorte fuera de los límites de la imagen original. Esto causa un error de falta de memoria. Parece un poco extraño, pero puede ser útil saberlo.

También obtuve esto cuando intenté usar el método Clone () para cambiar el formato de píxeles de un bitmap. Si la memoria sirve, estaba tratando de convertir un bitmap de 24 bpp en un formato indexado de 8 bits, esperando ingenuamente que la clase Bitmap manejara mágicamente la creación de la paleta, y así sucesivamente. Obviamente no :-/

Este es un scope, pero a menudo he descubierto que si tira imágenes directamente del disco, es mejor copiarlas en un nuevo bitmap y desechar la imagen en disco. He visto una gran mejora en el consumo de memoria al hacerlo.

Dave M. también tiene dinero … asegúrese de disponer cuando termine.

Luché para resolver esto recientemente: las respuestas anteriores son correctas. La clave para resolver este problema es garantizar que el rectángulo esté realmente dentro de los límites de la imagen. Vea un ejemplo de cómo resolví esto.

En pocas palabras, se verificó si el área que se estaba clonando estaba fuera del área de la imagen.

 int totalWidth = rect.Left + rect.Width; //think -the same as Right property int allowableWidth = localImage.Width - rect.Left; int finalWidth = 0; if (totalWidth > allowableWidth){ finalWidth = allowableWidth; } else { finalWidth = totalWidth; } rect.Width = finalWidth; int totalHeight = rect.Top + rect.Height; //think same as Bottom property int allowableHeight = localImage.Height - rect.Top; int finalHeight = 0; if (totalHeight > allowableHeight){ finalHeight = allowableHeight; } else { finalHeight = totalHeight; } rect.Height = finalHeight; cropped = ((Bitmap)localImage).Clone(rect, System.Drawing.Imaging.PixelFormat.DontCare); 

Asegúrese de estar llamando .Dispose () correctamente en sus imágenes; de lo contrario, los recursos no administrados no se liberarán. Me pregunto cuántas imágenes estás creando aquí, ¿cientos? ¿Miles?