2010-08-24 20 views
6

Estoy tratando de cargar una imagen extremadamente grande (14473x25684), pero estoy entrando en una limitación de memoria.OutofMemoryException - Cargando imágenes extremadamente grandes

Aquí es un programa sencillo para demostrar el problema:

static void Main(string[] args) 
{ 
    string largeimage = @"C:\Temp\test_image.jpg"; // 14473x25684 

    Image i = Bitmap.FromFile(largeimage); // OutofMemoryException was unhandled 
} 

Ahora entiendo que la cuestión no es relevante para la cantidad de memoria física que tengo, sino más bien es una limitación de direccionamiento. ¿Hay algo que pueda hacer para evitar esta limitación?

La imagen es de hecho válida y se abre bien en Photoshop (Tamaño de la VM: 916MB) y ACDSee. Además, no se moleste en buscar las dimensiones ya que las dimensiones enumeradas no son exactas. :)

Gracias por su tiempo.

+0

Me he encontrado con esto antes. Por lo que puedo decir, es el marco el que se está volviendo loco. –

+0

Wow. Esa es una gran imagen. Desafortunadamente, la clase de mapa de bits del marco no cubrirá sus necesidades. Es posible que considere que adoptar un enfoque fragmentado, en el que ubicar el encabezado del mapa de bits usted mismo y muestrear los píxeles en una dimensión de imagen más manejable es su mejor opción. Sin embargo, es un desafío, ya que implica una pequeña reconstrucción de la rueda. Me sorprendería si Photoshop y ACDSee cargan toda la imagen sin comprimir en la memoria. – kbrimington

Respuesta

4

La clase Bitmap requerirá alrededor de 1,5 GB de memoria para contener esa instancia. El asignador de memoria .NET normalmente asfixia alrededor de la marca de 1 GB.

0

El sistema operativo no puede asignar una cantidad contigua de memoria. Todo lo que puede hacer al respecto es usar MemoryFailPoint y atrapar InsufficientMemoryException. Pero esto solo lo salvará de la falla de la aplicación.
En cuanto a mí, para abrir un archivo tan grande debe usar un lector binario y dibujar un archivo a través de System.Drawing.

aquí es buena pregunta y respuestas When is it OK to catch an OutOfMemoryException and how to handle it?

+0

El sistema operativo puede hacerlo (si se trata de un sistema operativo de 64 bits), pero el .NET Framework no puede (incluso si se trata de 64 bits). –

Cuestiones relacionadas