C# "Paramètre n'est pas valide."création de nouvelles bitmap

si j'essaie de créer une image bitmap plus de 19000 px j'obtiens l'erreur: Paramètre n'est pas valide. Comment je peux contourner ça??

System.Drawing.Bitmap myimage= new System.Drawing.Bitmap(20000, 20000);
27
demandé sur johnnyRose 2011-06-13 21:03:23

5 réponses

Gardez à l'esprit, c'est BEAUCOUP de mémoire que vous essayez d'attribuer à l'image Bitmap.

Consulter 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.

légèrement plus difficile à lire, mais cette référence aide comme bien:

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

chaque image dans le 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 par 4050 nécessitera plus de 660 méga-octets de mémoire.

31
répondu Zhais 2018-02-19 08:06:42
cet article de Base de Connaissances parler des limites de GDI+ dans CreateBitmap. System.Drawing.Bitmap, en interne, utilise L'API native de GDI lorsque le bitmap est construit.

cela étant dit, un bitmap de cette taille est bien au-dessus D'un GB de RAM, et il est probable que vous frappez la limite de taille de ligne de scan (64KB) ou mémoire.

6
répondu Reed Copsey 2011-06-13 17:12:10

19000 pixels carrés, à 32bpp, nécessiterait 11552000000 bits (1,37 GO) pour stocker le matriciel en mémoire. Ce ne sont que les données brutes de pixel, tous les frais généraux supplémentaires inhérents au système.Dessin.Bitmap ajouterai. Aller jusqu'à 20K pixels carrés à la même profondeur de couleur exigerait 1,5 Go juste pour la mémoire de pixel brute. Dans un seul objet, vous utilisez les 3/4 de l'espace réservé à l'ensemble de l'application dans un environnement 32 bits. Un environnement 64 bits a des limites plus lâches( habituellement), 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 moniteur d'ordinateur, une image de 19000 pixels sur un côté serait de 14 écrans de large par 18 écrans de haut. Je peux seulement imaginer que vous faites des graphiques d'impression de haute qualité, auquel cas une image 720dpi serait un poster carré de 26".

6
répondu KeithS 2011-06-13 17:22:26

Positionnez le PixelFormat lorsque vous lancez un bitmap, comme:

new Bitmap(2000, 40000,PixelFormat.Format16bppRgb555)

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

2
répondu RainZhang 2017-04-01 08:34:28

Eu cette erreur lors de l'ouverture d'un fichier TIF. Le problème était dû à L'impossibilité d'ouvrir CMJN. Changement de colorspace de RGB à CMYK et pas d'erreur.

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

exemple 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
répondu live-love 2017-07-06 18:22:24