2010-08-24 30 views
6

J'essaie de charger une très grande image (14473x25684), mais je suis confronté à une limite de mémoire.OutofMemoryException - Chargement d'images extrêmement volumineuses

Voici un programme simple pour démontrer le problème:

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

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

Maintenant, je comprends que la question ne concerne pas la quantité de mémoire physique que j'ai, mais plutôt une limitation d'adressage. Y a-t-il quelque chose que je puisse faire pour contourner cette limitation?

L'image est en effet valide et elle s'ouvre correctement dans Photoshop (Taille de la machine virtuelle: 916 Mo) et ACDSee. Aussi, ne pas déranger à Google les dimensions que les dimensions indiquées ne sont pas exactes. :)

Nous vous remercions de votre temps.

+0

J'ai déjà rencontré ça auparavant. D'après ce que je peux dire, c'est le cadre qui donne le coup d'envoi. –

+0

Wow. C'est une grande image. Malheureusement, la classe Bitmap du framework ne couvrira pas vos besoins. Il se peut que vous trouviez la meilleure solution si vous adoptez une approche en bloc, où vous vous chargez vous-même d'assembler l'en-tête bitmap et d'échantillonner les pixels dans une dimension d'image plus gérable. C'est un défi cependant, car cela implique une petite reconstruction de la roue. Je serais surpris si Photoshop et ACDSee chargeaient toute l'image non compressée en mémoire. – kbrimington

Répondre

4

La classe Bitmap exigera environ 1,5 Go de mémoire pour maintenir cette instance. L'allocateur de mémoire .NET étouffe normalement autour de la marque 1 Go.

0

Le système d'exploitation ne peut pas allouer de quantité de mémoire contiguë. Tout ce que vous pouvez faire à ce sujet est l'utilisation de MemoryFailPoint et attraper InsufficientMemoryException. Mais cela ne fait que vous sauver de l'effondrement de l'application. Quant à moi, pour ouvrir un tel gros fichier, vous devez utiliser un lecteur binaire et dessiner un fichier via System.Drawing.

ici est bonne question et réponses When is it OK to catch an OutOfMemoryException and how to handle it?

+0

Le système d'exploitation peut le faire (s'il s'agit d'un système d'exploitation 64 bits), mais le .NET ne le peut pas (même si c'est 64 bits). –