9
votes

.NET Bitmap Class Constructor (INT, INT) et (INT, INT, PIXEFORFORT) lance l'argumentException sur des arguments parfaitement bons

J'ai un certain code qui fait quelque chose comme ça (des bits non pertinents étirés): xxx

n'importe où la plupart du temps que cela courait bien. En premier. Comme le projet a continué, il a commencé à échouer sur la nouvelle ligne bitmap. L'erreur qu'il donne est la suivante: "L'argumentException n'a pas été non gérée. Le paramètre n'est pas valide." Il n'y a aucune mention de quel paramètre il a un problème avec ou quoi que ce soit. Je suis exclu. Voici ce que je sais à coup sûr:

  1. BMP1 et BMP2 n'ont jamais été nuls quand cette erreur est lancée.
  2. la présence de la déclaration de si jamais fait une différence; Ça meurt Tout comme fréquemment sans.
  3. Les deux exemples de l'utilisation du constructeur ont jeté cette erreur.

    Je suis tenté de dire que c'est une erreur de mémoire, sauf cela ne mentionne rien du genre. La première dizaine de fois ou donc cela s'est produit les hauteurs totalisés sur 18 000 (d'où le nombre magique ci-dessus). FIMPING, C'était une sorte de barrière molle à notre système, nous venons de limiter les images à cette hauteur qui ont fait disparaître les exceptions après un certain temps.

    pour quelques données d'échantillon, l'exception que je regarde à droite Maintenant, a BMP1.Width à 2550, BMP1.Height à 6135 et BMP2.Height à 6285.

    Quelqu'un a des idées?


0 commentaires

3 Réponses :


0
votes

Quelqu'un a des idées?

envelopper l'appel qui lance argumentexception avec un track-catch (exception ex) et entrez dans le bloc d'exception pour voir l'exception brute. Il devrait vous donner plus de détails, comme quel argument est censé invalide. xxx


5 commentaires

Droit. Aurait dû mentionner que j'ai essayé cela. Cela ne me donne presque plus d'informations. Il n'y a pas d'exception interne, le message (dans son intégralité) est "Paramètre n'est pas valide.", La source est étiquetée comme "System.Drawing" et la trace de la pile a "à System.Drawing.Bitmap..ctor (largeur int32, Int32 hauteur, format de PixelFormat) "au niveau supérieur. Je ne sais pas quoi d'autre je pouvais obtenir de l'exception.


C'est intéressant. Et par intéressant je veux dire, "Puissiez-vous mener une vie intéressante" -Interest. Deux des ArgumentException Constructeurs acceptent une chaîne de noms de paramètres, et c'est intéressant que le constructeur bitmap ne l'utilise pas quand il est clair qu'il est disponible.


Toute solution pour ce problème?


@Fabianolothor, la réponse acceptée ci-dessus semble l'expliquer assez bien. C'est à dire. L'exception est médiocre, mais le problème est situé en pierre: pas assez de mémoire contiguë disponible pour la taille du bitmap que vous essayez d'allouer.


J'ai résolu mon problème en utilisant une autre classe d'ItextShaRP. J'utilise maintenant le projet WKHTMLTOPDF.



1
votes

Vérifiez si BMP1 ou BMP2 a été disposé (même s'il n'est pas null). Voyez ici:

Le paramètre mystérieux N'est pas une exception valide


0 commentaires

20
votes

GDI + ne génère pas de très bons messages d'exception. L'exception que vous avez obtenue est floconneuse, celle-ci le générera de manière fiable sur ma machine: xxx

Qu'est-ce qui se passe vraiment est que ce bitmap nécessite une mémoire non gérée trop contiguë pour stocker les bits bitmap, plus de est disponible dans votre processus. Sur un système d'exploitation de 32 bits, vous ne pouvez jamais espérer que vous n'éprouvez jamais un morceau de mémoire autour de 550 mégaoctets. Cela va rapidement sur la colline de là.

Le problème est l'adresse de l'espace fragmentation, la mémoire virtuelle de votre programme stocke un mélange de code et de données à diverses adresses. L'espace mémoire total est autour de 2 gigaoctets, mais le plus grand trou est beaucoup plus petit que cela. Vous ne pouvez consommer que toute la mémoire avec beaucoup de petites allocations, les gros échouent beaucoup plus rapidement.

Longue histoire courte: il tente de vous dire que la taille que vous avez demandée ne peut pas être prise en charge.

Un système d'exploitation 64 bits n'a pas ce problème. Assurez-vous de le profiter avec le projet> Propriétés> Onglet Construction, Cible de la plate-forme = AnyCPU et préférez 32 bits = non liés. En outre, WPF s'appuie sur WIC, une bibliothèque d'imagerie qui est beaucoup plus intelligente sur l'allocation de tampons pour les bitmaps.


3 commentaires

Ceci, couplé au lien de Kyralessa, a presque expliqué le problème. Maintenant, je dois juste réparer la fuite de mémoire. :( Merci les gars!


En fait, j'ai le même problème de débogage avec Visual Studio sur Windows 7 64 Bit. Sur un système d'exploitation 64 bits ne l'empêche pas complètement.


Changez le réglage de la citation de la plate-forme de votre projet EXE en AnyCPU afin que vous profitiez d'un espace d'adresse 64 bits.