2009-02-02 8 views
1

J'ai un problème urgent, je suis en train de convertir un tableau d'octets à un bitmap mais il me montre toujours:ArgumentException lors de la conversion octet [] pour Bitmap C#

System.ArgumentException: Paramètre valide .

mon code est le suivant:

Im passer les octets par un webservice avec:

string DecodedString = string.Empty; 
DecodedString = System.Text.Encoding.GetEncoding(1251).GetString(bytes); 
sResult = sResult + "<Photo>" +XmlConvert.EncodeName(DecodedString) + "</Photo>"; 

et dans mon WebPAGE:

byte[] bytes = (Byte[])System.Text.Encoding.GetEncoding(1251).GetBytes(XmlConvert.DecodeName(xDocument.SelectSingleNode("Response/Images/Photo").InnerText)); 
    System.IO.MemoryStream ms = new System.IO.MemoryStream(bytes); 

    System.Drawing.Bitmap b = new System.Drawing.Bitmap(ms);//(System.Drawing.Image.FromStream(ms)); 

Répondre

2

Essayez de passer la chaîne comme Base64:

string DecodedString = string.Empty; 
DecodedString = System.Convert.ToBase64String(bytes) 
sResult = sResult + "<Photo>" +XmlConvert.EncodeName(DecodedString) + "</Photo>"; 

...

byte[] bytes = System.Convert.FromBase64String(xDocument.SelectSingleNode("Response/Images/Photo").InnerText); 
System.IO.MemoryStream ms = new System.IO.MemoryStream(bytes); 
System.Drawing.Bitmap b = System.Drawing.Image.FromStream(ms); 

Vous aurez également pas besoin d'utiliser XmlConvert pour encoder/décoder la chaîne.

+0

Mais si je ne l'utilise le enconde/décoder le code XML ne peut pas être lu renvoie une exception XML non valide .. –

+0

* Ne pas * mettre une instruction using autour du flux dans ce cas. Lorsque vous avez appelé Image.FromStream, vous * ne devez pas * fermer le flux, sinon l'image sera brisée. Lorsque vous disposez de l'image, * cela * fermera le flux. –

+0

D'oh. J'étais pressé quand j'ai écrit la réponse et n'ai pas réellement lu le code entier:/ – configurator

0

J'ai rencontré un problème similaire récemment, mais en utilisant Silverlight. J'ai fini par avoir besoin de créer un gestionnaire HTTP personnalisé afin de passer le byte [] qui a défini l'image comme un flux.

Voir http://www.dotnetcurry.com/ShowArticle.aspx?ID=220

Edit: Cela vous permet d'éviter se soucier de l'encodage XML, et transmet l'image de retour en forme binaire ... YMMV

+0

Même erreur en essayant cette solution. –

+0

Où obtenez-vous l'octet []? Êtes-vous sûr que les données dans le tableau sont correctes? – vt100

+0

l'octet vient de: System.IO.FileStream fs = nouveau System.IO.FileStream (sPath, System.IO.FileMode.Open, System.IO.FileAccess.Read); int streamLength = Convert.ToInt32 (fs.Length); bytes = nouvel octet [streamLength]; fs.Read (octets, 0, longueur de flux); dans le service Web. –

0

Essayez ceci:

byte[] bytes = System.Convert.FromBase64String(xDocument.SelectSingleNode("Response/Images/Photo").InnerText); 
System.Drawing.ImageConverter imageConverter = new System.Drawing.ImageConverter(); 
Image image = imageConverter.ConvertFrom(bytes) as Image; 
System.Drawing.Bitmap b = new System.Drawing.BitMap(image); 

EDIT

Regardez ceci:

Transfer any files on Web services by c#

+0

Maintenant l'erreur est dans cette ligne et c'est la même chose ** Le paramètre n'est pas une erreur valide ** System.Drawing.Image image = imageConverter.ConvertFrom (octets) comme System.Drawing.Image; –

+0

Vérifiez octets.Longueur, assurez-vous que vous avez réellement des octets dans le tableau d'octets. – Phaedrus

+0

vérifié, toujours le même problème. l'octet provient de: System.IO.FileStream fs = new System.IO.FileStream (sPath, System.IO.FileMode.Open, System.IO.FileAccess.Read); int streamLength = Convert.ToInt32 (fs.Length); bytes = nouvel octet [streamLength]; fs.Read (octets, 0, streamLength); dans le service Web –

0

Selon MSDN:

ArgumentException - Le flux n'a pas un format d'image valide

Je crois que votre problème est dans le tableau byte[] d'origine, vous passez au service Web. Selon un de vos commentaires, vous avez fait:

System.IO.FileStream fs = new System.IO.FileStream(sPath, System.IO.FileMode.Open, System.IO.FileAccess.Read); 
int streamLength = Convert.ToInt32(fs.Length); 
bytes = new byte[streamLength]; 
fs.Read(bytes, 0, streamLength); 

fs.Read renvoie le nombre d'octets qui ont été lus dans le tableau d'octets; il ne lit pas toujours le fichier entier! Essayez la méthode StreamFile de http://www.dotnetspider.com/resources/4515-convert-file-into-byte-array.aspx. (Premier résultat de Google search)

+0

Ok, je vais essayer cela et voir si cela fonctionne, mais quand je n'utilise pas un service web, le code wirks et l'image montre. –

+0

Non, il ne fonctionne pas même erreur Le paramètre est non Valide –

2

FINALLLYYYY,

je l'ai fait, avec l'aide de tous, voici mon code de la page

byte[] bytes = System.Convert.FromBase64String(xDocument.SelectSingleNode("Response/Images/Photo").InnerText); 


    System.IO.MemoryStream ms = new System.IO.MemoryStream(bytes); 

    System.Drawing.Bitmap b = new System.Drawing.Bitmap(ms); //(Bitmap)System.Drawing.Image.FromStream(ms); 

    System.Drawing.Imaging.FrameDimension frameDim; 
    frameDim = new System.Drawing.Imaging.FrameDimension(b.FrameDimensionsList[0]); 


    int NumberOfFrames = b.GetFrameCount(frameDim); 
    string[] paths = new string[NumberOfFrames]; 

    for (int i = 0; i < NumberOfFrames; i++) 
    { 
    b.SelectActiveFrame(frameDim, i); 

    System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(b); 
    paths[i] = imagePathfile.Remove(imagePathfile.Length - 4, 4) + i.ToString() + ".gif"; 

    bmp.Save(paths[i], System.Drawing.Imaging.ImageFormat.Gif); 
    //bmp.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif); 
    bmp.Dispose(); 
    } 

    Image1.Src = paths[0]; 
    //Check if there's more than 1 image cause its a TIFF 
    if (paths.Length>1) 
    { 
     Image2.Src = paths[1]; 
    } 

Merci à vous tous ..... Luis.

0

En fait j'avais été rencontrer ce problème, Dans mon cas, lorsque j'utilise le navigateur IE, c'est ok mais quand utiliser un autre navigateur, il a toujours la même erreur.

"L'exception de paramètre n'est pas valide se produit toujours dans la même ligne de code: System.Drawing.Image.FromStream (ms));"

Donc je pense qu'il semble que ce problème dépend du navigateur et du type d'image (JPEG, JPEG2000).

0

Voici un code je convertir octets à une image pour un test unitaire:

protected override Image LoadImage() 
    { 
     //get a temp image from bytes, instead of loading from disk 
     //data:image/gif;base64, 
     byte[] bytes = Convert.FromBase64String("R0lGODlhAQABAIAAAAAAAAAAACH5BAAAAAAALAAAAAABAAEAAAICTAEAOw=="); 

     Image image; 
     using (MemoryStream ms = new MemoryStream(bytes)) 
     { 
      image = Image.FromStream(ms); 
     } 

     return image; 
    } 
0

À ma connaissance, l'image ne peut pas être affichée car le format des octets de l'image est correcte. chaque format d'image a sa propre tête ou sth.

J'espère que cela peut vous aider.

se réfèrent à Sri3108:
Tnx à l'avance. Sri> Merci pour cela .. son travail pour moi..mais le problème est confronté est que l'image affichée n'a pas même clarté d'origine..Peut-on un dites-moi quel est le problème? Que dois-je faire pour maintenir la même clarté d'origine après decode ..

Questions connexes