2012-05-17 17 views
6

Necesito crear una imagen enorme (aproximadamente 24000 x 22000) con la codificación PixelFormat.Format24bppRgb. Sé que será casi imposible abrirlo ...Generar una imagen enorme en C#

Lo que estoy tratando de hacer es lo siguiente:

Bitmap final = new Bitmap(width, height, PixelFormat.Format24bppRgb); 

Como era de esperar, se produce una excepción, ya que no puedo manejar un archivo de 11GB en memoria fácil de esa manera.

Pero tenía una idea: ¿podría escribir el archivo como lo estoy generando? Entonces, en lugar de trabajar en la RAM, estaría trabajando en HD.

Solo para explicarlo mejor: tengo alrededor de 13K fichas y planeo unirlas en este archivo estúpidamente gigantesco. Como puedo iterarlos en un orden dado, creo que podría escribirlo directamente en la memoria usando un código inseguro.

¿Alguna sugerencia?

+0

En lugar de código no administrado, lea el código no seguro ... –

+4

Consulte [Archivos mapeados en memoria] (http://msdn.microsoft.com/en-us/library/dd997372.aspx). – GSerg

+1

@GSerg archivo de mapa de memoria _can_ se puede usar para abrir/editar secciones de un archivo grande ... pero ** NO RECOMENDADO ** crear esos archivos grandes en la memoria mappedfile !!! –

Respuesta

2

Puede escribirlo en un formato no comprimido como BMP. BMP guarda bytes de color sin procesar en filas. Así que cargaría la primera fila de mosaicos, leería sus filas de píxeles separadas y lo escribiría como una sola fila compuesta en la imagen de salida. De esta manera, puede abrir solo algunos mosaicos y escribir inmediatamente la imagen de salida.

Pero no sé cómo escribirlo como una imagen comprimida, como JPG o PNG. Pero estoy seguro de que existe algún software especializado para eso.

+0

He recibido su idea y es un buen enfoque, pero hay un problema: como la clase Bitmap comprueba si el sistema puede manejar archivos tan grandes, no me deja pasar del nuevo mapa de bits(). –

+1

El punto clave aquí es que no deberías usar ninguna clase en construcción para la manipulación de imágenes. Deberías hacerlo en bruto. Entonces, como dije, use BMP, que es un formato de imagen sin formato extremadamente simple, que puede escribir sin ningún algoritmo de compresión complejo. – Euphoric

+0

Hmmm ... Ahora lo tengo. ¡De hecho, es una buena idea! Voy a probar! ¡Gracias! –

0

Dependiendo de lo que piense hacer con esta imagen al finalizar, le sugiero dividirla en 4 y trabajar de esa manera. He trabajado con 10,000 x 10,000 píxeles sin que se haya lanzado la excepción OOM.

+0

Ahora mismo es exactamente lo que estoy haciendo y es una solución válida, pero como no tengo prisa en crear estos archivos, ¡estoy estudiando los enfoques para el problema! –

+0

FWIW, me parece mucho más seguro permanecer por debajo de 8192 x 8192 píxeles. Especialmente si mantiene múltiples texturas en la memoria a la vez (por ejemplo, para copiar de una a otra). – ToolmakerSteve

3

ImageMagick's Large Image Support (tera-pixel) pueden ayudarlo a juntar la imagen una vez que tenga los mosaicos que la componen. Puede utilizar la línea de comando y emitir comandos utilizando el contenedor this o utilizar este ImageMagick.NET como API.

+0

¡Parece prometedor! Voy a echar un vistazo a esta API! ¡Gracias! –

+0

Versión actualizada de ImageMagik.NET http://magick.codeplex.com/ – Jonathan

+0

Gracias por el enlace a ImageMagick.NET - No lo había notado antes. – ToolmakerSteve