ejemplo - image to bitmap c#
C#Image.Clone Excepción de memoria (6)
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?
¿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 <BitMap> 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 mapa de bits 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 mapa de bits 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 mapa de bits. No los recortará automáticamente.
Descubrí que estaba usando Image.Clone para recortar un mapa de bits 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.
Este es un alcance, pero a menudo he descubierto que si tira imágenes directamente del disco, es mejor copiarlas en un nuevo mapa de bits 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);
También obtuve esto cuando intenté usar el método Clone () para cambiar el formato de píxeles de un mapa de bits. Si la memoria sirve, estaba tratando de convertir un mapa de bits 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 :-/