web-dev-qa-db-fra.com

C # "Le paramètre n'est pas valide." création d'un nouveau bitmap

si j'essaie de créer un bitmap supérieur à 19000 px, j'obtiens l'erreur: Le paramètre n'est pas valide. Comment puis-je contourner ce problème ??

System.Drawing.Bitmap myimage= new System.Drawing.Bitmap(20000, 20000);
30
teocomi

Gardez à l'esprit, c'est beaucoup de mémoire que vous essayez d'allouer avec ce bitmap.

Reportez-vous à http://social.msdn.Microsoft.com/Forums/en-US/netfxbcl/thread/37684999-62c7-4c41-8167-745a2b486583/

.NET refuse probablement de créer une image qui utilise autant de mémoire contiguë à la fois.

Un peu plus difficile à lire, mais cette référence aide également:

http://www.tech-archive.net/Archive/DotNet/Microsoft.public.dotnet.framework.drawing/2005-06/msg00176.html

Chaque image du système a la quantité de mémoire définie par cette formule:

bit-depth * width * height / 8

Cela signifie qu'une image de 40800 pixels sur 4050 nécessitera plus de 660 mégaoctets de mémoire.

33
Zhais

19000 pixels carrés, à 32 bpp, nécessiteraient 11552000000 bits (1,37 Go) pour stocker le raster en mémoire. Ce ne sont que les données brutes des pixels; toute surcharge supplémentaire inhérente à System.Drawing.Bitmap ajouterait à cela. Aller jusqu'à 20 000 pixels carrés à la même profondeur de couleur nécessiterait 1,5 Go uniquement pour la mémoire brute des pixels. Dans un seul objet, vous utilisez les 3/4 de l'espace réservé à l'application entière dans un environnement 32 bits. Un environnement 64 bits a des limites plus lâches (généralement), mais vous utilisez toujours les 3/4 de la taille maximale d'un seul objet.

Pourquoi avez-vous besoin d'une telle taille d'image colossale? Vue à 1280x1024 res sur un écran d'ordinateur, une image de 19000 pixels sur un côté aurait 14 écrans de large par 18 écrans de haut. Je ne peux qu'imaginer que vous faites des graphiques d'impression de haute qualité, auquel cas une image 720dpi serait une affiche carrée de 26 ".

8
KeithS

Je soupçonne que vous rencontrez des problèmes de limite de mémoire. Cependant, il existe de nombreuses raisons pour lesquelles un constructeur bitmap peut échouer. Les principaux sont répertoriés dans cet article de la base de connaissances parlant des limites de GDI + dans CreateBitmap. System.Drawing.Bitmap, en interne, utilise l'API native GDI lorsque le bitmap est construit.

Cela étant dit, un bitmap de cette taille dépasse largement un Go de RAM, et il est probable que vous atteigniez la limitation de taille de ligne de numérisation (64 Ko) ou que vous manquiez de mémoire.

6
Reed Copsey

Définissez le PixelFormat lorsque vous créez une nouvelle image bitmap, comme:

new Bitmap(2000, 40000,PixelFormat.Format16bppRgb555)

et avec le nombre exact ci-dessus, cela fonctionne pour moi. Cela peut résoudre en partie le problème.

5
RainZhang

Vous avez cette erreur lors de l'ouverture d'un fichier TIF. Le problème était dû à l'impossibilité d'ouvrir CMJN. Espace colorimétrique modifié de RVB à CMJN et aucune erreur n'a été détectée.

J'ai donc utilisé la bibliothèque taglib pour obtenir la taille du fichier image à la place.

Échantillon de code:

try
{
    var image = new System.Drawing.Bitmap(filePath);
    return string.Format("{0}px by {1}px", image.Width, image.Height);
}
catch (Exception)
{
    try
    {
         TagLib.File file = TagLib.File.Create(filePath);
         return string.Format("{0}px by {1}px", file.Properties.PhotoWidth, file.Properties.PhotoHeight);
    }
    catch (Exception)
    {
         return ("");
    }
}
0
live-love