Actualmente estoy manejando imágenes muy grandes, que básicamente se generan uniendo muchas imágenes más pequeñas (por ejemplo, software de mosaico panorámico o fotográfico). Para evitar excepciones a la memoria insuficiente (en la memoria solo hay "mapas" de cómo organizar las imágenes más pequeñas), escribí un código guardando estas imágenes línea por línea como mapas de bits usando BinaryWriter y LockBits. Hasta aquí todo bien.C# guardando mapas de bits muy grandes como jpegs (o cualquier otro formato comprimido)
El problema ahora es que me gustaría guardar estas imágenes como Jpegs (o PNG) también. Como soy bastante nuevo en C#, ahora solo puedo pensar en dos maneras:
1) Similar al procedimiento de guardado del mapa de bits. Generando un encabezado jpeg y guardando las imágenes grandes línea por línea, comprimiéndolas de alguna manera antes. Aunque no tengo idea de cómo realizar la compresión.
2) Transmitiendo el mapa de bits ya guardado a la memoria y guardándolo como jpeg codificado.
Desde el segundo enfoque parecía más fácil, he intentado algo como esto:
FileStream fsr =
new FileStream("input.bmp", FileMode.Open, FileAccess.Read);
FileStream fsw =
new FileStream("output.jpg", FileMode.CreateNew, FileAccess.Write);
EncoderParameters encoderParameters = new EncoderParameters(1);
encoderParameters.Param[0] =
new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 80L);
Bitmap bmp = new Bitmap(fsr);
bmp.Save(fsw, GetEncoder(ImageFormat.Jpeg), encoderParameters);
bmp.Dispose();
El problema ahora es que el método de guardar intenta cargar por completo el mapa de bits en la memoria primero, causando un out-of-memory excepción.
Estaría más que feliz por cualquier sugerencia sobre cómo resolver o eludir este problema.
OutOfMemoryException en esta época? ¿Qué tan grande es tu mapa de bits? – zmbq
sí, puede encontrarse con problemas de memoria fácilmente, estaba redimensionando alrededor de 10K imágenes y ejecutándose en 'OutOfMemoryException' a menudo, aunque estaba desechando correctamente. – DarthVader
OOM de un mapa de bits es muy sospechoso. Esta clase arrojará la excepción de memoria para casi todo lo que sale mal, incluidos los parámetros incorrectos, etc. –