2009-05-31 10 views
1

J'ai une fonction qui extrait un fichier dans un tableau d'octets (données).Images bitmap C#, tableaux d'octets et flux!

 int contentLength = postedFile.ContentLength; 
     byte[] data = new byte[contentLength]; 
     postedFile.InputStream.Read(data, 0, contentLength); 

Plus tard, j'utiliser ce tableau d'octets pour construire un objet System.Drawing.Image (où les données est le tableau d'octets)

 MemoryStream ms = new MemoryStream(data); 
     Image bitmap = Image.FromStream(ms); 

je reçois l'exception suivante « ArgumentException: Le paramètre n'est pas valide "

Le fichier affiché contenait une image originale 500k jpeg ...

Toutes les idées pourquoi ce isnt travail?

Note: Je vous assure que j'ai une raison valable de convertir en un tableau d'octets, puis à un flux de mémoire !!

+0

Les données contiennent-elles uniquement les données d'image? Vous ne dites pas quel type 'postedFile' est. – ChrisF

+1

D'où obtenez-vous cette erreur? Le code que vous avez posté devrait fonctionner correctement ... –

+0

postedFile est un HttpPostedFileBase. L'erreur se produit sur la ligne Image bitmap = Image.FromStream (ms); :( – iasksillyquestions

Répondre

5

Cela est probablement dû au fait que vous n'avez pas récupéré toutes les données de fichier dans le tableau d'octets. La méthode Read ne doit pas renvoyer autant d'octets que vous le souhaitez et renvoie le nombre d'octets réellement mis dans le tableau. Vous devez effectuer une boucle jusqu'à ce que vous ayez obtenu toutes les données:

int contentLength = postedFile.ContentLength; 
byte[] data = new byte[contentLength]; 
for (int pos = 0; pos < contentLength;) { 
    pos += postedFile.InputStream.Read(data, pos, contentLength - pos); 
} 

Il s'agit d'une erreur courante lors de la lecture d'un flux. J'ai souvent vu ce problème.

Edit:
Avec le chèque pour une fin précoce de cours d'eau, comme Matthieu suggère, le code serait:

int contentLength = postedFile.ContentLength; 
byte[] data = new byte[contentLength]; 
for (int pos = 0; pos < contentLength;) { 
    int len = postedFile.InputStream.Read(data, pos, contentLength - pos); 
    if (len == 0) { 
     throw new ApplicationException("Upload aborted."); 
    } 
    pos += len; 
} 
+0

utilisé le code suggéré: int ContentLength = postedFile.ContentLength; octet [] data = new byte [ContentLength]; for (int pos = 0; pos iasksillyquestions

+0

Vous devriez également vérifier un retour 0, juste au cas où vous atteignez la fin du flux plus tôt. –

+0

Isnt 0 est une valeur valide? – iasksillyquestions

1

Vous ne vérifiez pas la valeur de retour de postedFile.InputStream. Read. C'est pas à tout garanti pour remplir le tableau sur le premier appel. Cela laissera un JPEG corrompu dans les données (0 au lieu du contenu du fichier).

0

J'ai eu des problèmes pour charger des images dans .NET qui pouvaient être ouvertes par des bibliothèques d'images plus robustes. Il est possible que l'image jpeg spécifique que vous avez n'est pas supportée par .NET. Les fichiers jpeg ne sont pas seulement un type d'encodage, il existe une variété de schémas de compression possibles.

Vous pouvez l'essayer avec une autre image que vous connaissez dans un format pris en charge.

1

Avez-vous vérifié la valeur de retour de l'appel Read() pour vérifier que tout le contenu est effectivement lu? Peut-être que Read() ne renvoie qu'une partie du flux, vous obligeant à boucler l'appel Read() jusqu'à ce que tous les octets soient consommés.

1

Toute raison pour laquelle vous ne faites pas simplement ceci:

Image bitmap = Image.FromStream(postedFile.InputStream); 
+0

> Note: Je vous assure que j'ai une raison valable > pour la conversion à un tableau d'octets > puis à un flux de mémoire !! – snarf