2009-02-02 3 views
1

У меня есть насущная проблема, я пытаюсь преобразовать массив байтов в растровое изображение, но он всегда показывает мне:ArgumentException при преобразовании байт [] в растровое изображение с #

System.ArgumentException Параметр не действителен ,

мой код выглядит следующим образом:

Im передавая байты через веб-сервиса с:

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

и в моей веб-странице:

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)); 

ответ

2

Попробуйте передавая строку как 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); 

Вы также не должны использовать XmlConvert для кодирования/декодирования строки.

+0

Но если я не использовать enconde/декодировать XML не может быть прочитан он выдает неверный исключение XML .. – 2009-02-02 14:16:58

+0

* Не * положить в этом случае используется инструкция вокруг потока. Когда вы вызываете Image.FromStream, вы * не должны * закрывать поток или изображение будет разбито. Когда вы удаляете изображение, * это * закроет поток. –

+0

D'oh. Я спешил, когда написал ответ и фактически не прочитал весь код:/ – configurator

0

У меня была аналогичная проблема недавно, но с использованием Silverlight. В итоге мне пришлось создать пользовательский обработчик HTTP, чтобы передать байт [], который определил образ назад как поток.

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

Edit: Это позволяет избежать беспокоиться о кодировке XML, и передает изображение обратно в двоичной форме ... YMMV

+0

Такая же ошибка при попытке этого решения. – 2009-02-02 15:08:27

+0

Где вы получаете байт []? Вы уверены, что данные в массиве верны? – vt100

+0

байт исходит от: System.IO.FileStream fs = new System.IO.FileStream (sPath, System.IO.FileMode.Open, System.IO.FileAccess.Read); int streamLength = Convert.ToInt32 (fs.Length); bytes = новый байт [streamLength]; fs.Read (байты, 0, streamLength); в веб-службе. – 2009-02-02 15:51:05

0

Попробуйте это:

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

Посмотрите на это:

Transfer any files on Web services by c#

+0

Теперь ошибка в этой строке и ее то же самое ** Параметр не является допустимым Ошибка ** System.Drawing.Image image = imageConverter.ConvertFrom (bytes) as System.Drawing.Image; – 2009-02-02 15:46:40

+0

Проверьте bytes.Length, убедитесь, что на самом деле у вас есть байты в массиве байтов. – Phaedrus

+0

проверено, все та же проблема. Байт исходит из: System.IO.FileStream fs = new System.IO.FileStream (sPath, System.IO.FileMode.Open, System.IO.FileAccess.Read); int streamLength = Convert.ToInt32 (fs.Length); bytes = новый байт [streamLength]; fs.Read (байты, 0, streamLength); в веб-службе – 2009-02-02 15:53:02

0

По MSDN:

ArgumentException - поток не имеет допустимый формат изображения

Я считаю, что ваша проблема в исходном массиве byte[] вы передаете на веб-сервис. Согласно одному из ваших комментариев, вы сделали:

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 возвращает количество байтов, которые были считаны в массив байтов; он не всегда читает весь файл!
Пробуйте использовать метод StreamFile от http://www.dotnetspider.com/resources/4515-convert-file-into-byte-array.aspx. (Первый результат Google search)

+0

Хорошо, я попробую это и посмотрю, работает ли, но когда я не использую веб-службу, код wirks и изображение отображаются. – 2009-02-02 16:02:55

+0

Нет, он не работает с той же ошибкой Параметр не действителен – 2009-02-02 16:12:07

2

FINALLLYYYY,

я сделал это с помощью всех вас, вот мой код страницы

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]; 
    } 

Благодаря вам всем ..... Luis.

0

Фактически я встречал эту проблему. В моем случае, когда я использую браузер IE, это нормально, но при использовании другого браузера всегда имеет ту же ошибку.

Параметр не является допустимым исключением всегда происходит в одной строке кода: System.Drawing.Image.FromStream (ms)); "

Так что я думаю, что эта проблема зависит от браузера и типа изображения (JPEG, JPEG2000).

0

Вот код, я использовал преобразование байтов в изображение для модульного тестирования:

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

В моем понимании, изображение не может быть показано, так как формат байтов на изображение не является правильным. каждый формат изображения имеет свою собственную голову или sth.

Я надеюсь, что это может вам помочь.

см Sri3108:
Tnx заранее. Sri> Спасибо за это ... они работают на me..but проблема с лицевой стороной является то, что отображение изображения не имеет то же оригинальное ясность..может любой скажите мне, в чем проблема? Что я должен сделать, чтобы сохранить тот же оригинальную ясность после декодирования ..

Смежные вопросы