web-dev-qa-db-fra.com

Exception "Paramètre non valide" lors du chargement de System.Drawing.Image

Pourquoi est-ce que j'obtiens l'exception "Paramètre non valide" dans mon code:

MemoryStream ms = new MemoryStream(byteArrayIn);
System.Drawing.Image returnImage = System.Drawing.Image.FromStream(ms);

La longueur de byteArrayIn est 169014. J'obtiens cette exception malgré le fait qu'aucune valeur ne soit supérieure à 255.

30
manoj

J'ai eu le même problème et apparemment est résolu maintenant, malgré cela et certaines autres exceptions gdi + sont très trompeuses, j'ai trouvé qu'en fait le problème était que le paramètre envoyé à un constructeur Bitmap n'était pas valide. J'ai ce code:

using (System.IO.FileStream fs = new System.IO.FileStream(inputImage, System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite))
{
    try
    {
        using (Bitmap bitmap = (Bitmap)Image.FromStream(fs, true, false))
        {
            try
            {
                bitmap.Save(OutputImage + ".bmp", System.Drawing.Imaging.ImageFormat.Bmp);
                GC.Collect();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
    catch (ArgumentException aex)
    {
        throw new Exception("The file received from the Map Server is not a valid jpeg image", aex);
    }
}

La ligne suivante provoquait une erreur:

Bitmap bitmap = (Bitmap)Image.FromStream(fs, true, false)

Le flux de fichiers a été créé à partir du fichier téléchargé depuis Map Server. Mon application envoyait la demande de manière incorrecte pour obtenir l'image, et le serveur renvoyait quelque chose avec l'extension jpg, mais était en fait un html me disant qu'une erreur s'est produite. Je prenais donc cette image et j'essayais de construire un bitmap avec. Le correctif consistait à contrôler/valider l'image pour une image jpeg valide.

J'espère que cela aide!

18
Sebastian

Je suppose que byteArrayIn ne contient pas de données d'image valides.

Veuillez donner plus d'informations cependant:

  • Quelle ligne de code lève une exception?
  • Quel est le message?
  • D'où avez-vous obtenu byteArrayIn et êtes-vous sûr qu'il devrait contenir une image valide?
14
Jon Skeet
byte[] fileData = null;
using (var binaryReader = new BinaryReader(Request.Files[0].InputStream))
{
    fileData = binaryReader.ReadBytes(Request.Files[0].ContentLength);
}
ImageConverter imageConverter = new System.Drawing.ImageConverter();
System.Drawing.Image image = imageConverter.ConvertFrom(fileData) as System.Drawing.Image;
image.Save(imageFullPath, System.Drawing.Imaging.ImageFormat.Jpeg);
4
Savas Adar

Quelle ligne lève l'exception? Le new MemoryStream(...)? ou le Image.FromStream(...)? Et qu'est-ce que le byteArrayIn? Est-ce un byte[]? Je demande seulement à cause du commentaire "Et rien de valeur n'est pas supérieur à 255" - ce qui bien sûr est automatique pour un byte[].

Comme une question plus évidente: le binaire contient-il réellement une image dans un format sensible?

Par exemple, le code suivant (bien que pas très bon) fonctionne bien:

    byte[] data = File.ReadAllBytes(@"d:\extn.png"); // not a good idea...
    MemoryStream ms = new MemoryStream(data);
    Image img = Image.FromStream(ms);
    Console.WriteLine(img.Width);
    Console.WriteLine(img.Height);
3
Marc Gravell

L'exception "paramètre n'est pas valide" levée par Image.FromStream() vous indique que le flux n'est pas un format "valide" ou "reconnu". Regardez les flux de mémoire, surtout si vous prenez divers décalages d'octets d'un fichier.

// 1. Create a junk memory stream, pass it to Image.FromStream and 
// get the "parameter is not valid":
MemoryStream ms = new MemoryStream(new Byte[] {0x00, 0x01, 0x02});
System.Drawing.Image returnImage = System.Drawing.Image.FromStream(ms);`

// 2. Create a junk memory stream, pass it to Image.FromStream
// without verification:
MemoryStream ms = new MemoryStream(new Byte[] {0x00, 0x01, 0x02});
System.Drawing.Image returnImage = System.Drawing.Image.FromStream(ms, false, true);

L'exemple 2 fonctionnera, notez que useEmbeddedColorManagement doit être faux pour que validateImageData soit valide.

Il peut être plus facile de déboguer en vidant le flux de mémoire dans un fichier et en inspectant le contenu.

1
Sam

Cette erreur est due à l'insertion de données binaires dans un tampon. Pour résoudre ce problème, vous devez insérer une instruction dans votre code.

Cette déclaration est:

obj_FileStream.Read(Img, 0, Convert.ToInt32(obj_FileStream.Length));

Exemple:

FileStream obj_FileStream = new FileStream(str_ImagePath, FileMode.OpenOrCreate, FileAccess.Read);
Byte[] Img = new Byte[obj_FileStream.Length];
obj_FileStream.Read(Img, 0, Convert.ToInt32(obj_FileStream.Length));         
dt_NewsFeedByRow.Rows[0][6] = Img;
1
gandarmin