2010-11-18 2 views
7

Я реализовал следующие функции, которые соединяются с webservice и загружают значки с данного сайта и сохраняют его в байт [], который я храню в нашем база данных. Теперь я хочу настроить его так, чтобы он сохранил значок на диске. Однако, когда я пытаюсь создать изображение из байта [], я получаю «Параметр недействителен».Создание и сохранение изображения из байта [] вызывает неправильное значение параметра

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

stream.Write(imageByteArray, 0, imageByteArray.Length); 
Image i = Image.FromStream(stream); // EXCEPTION HAPPENS HERE. 
i.Save(@"C:\tmp\" + filename + ".ico"); 

Исключение происходит на средней линии.

Этот код отлично работает 9 раз из десяти, но для некоторых значков даже считается, что значок является допустимым изображением (или, по крайней мере, оно появляется, и оно отображается в браузере, когда указывает на это) Я получаю это исключение ,

У кого-нибудь есть идеи? Я тяну свои волосы сюда!

Благодаря

Dave

Edit: значение в массиве, который появляется, чтобы бросить ошибку 127.

+0

Как вы собираете эти файлы favicon? Вы уверены, что файл всегда существует? Вы проверяете 'imageByteArray.Length == 0'? – Oded

+0

Да, я уверен, что массив не равен нулю, и когда я сохраняю этот значок в Db, он отлично работает. – Dave

ответ

20

Там нет необходимости ставить это в изображение, просто выплюнуть байты прямо:

var fs = new BinaryWriter(new FileStream(@"C:\\tmp\\" + filename + ".ico", FileMode.Append, FileAccess.Write)); 
fs.Write(imageByteArray); 
fs.Close(); 
+0

Отлично, я действительно тратил слишком много времени, думая в коробке. – Dave

+1

Лучше использовать инструкцию 'using', а не открывать и закрывать поток вручную. – SepehrM

+0

Отличный ответ! – Rahnzo

0

Добавить формат изображения:

stream.Position = 0; 
i.Save(@"C:\tmp\" + filename + ".ico", System.Drawing.Imaging.ImageFormat.Icon); 
+0

Исключение составляет линию до этого, начиная с строки Image.FromStream (поток); Похоже, что значение в массиве байтов, которое взрывается, содержит 127 – Dave

+0

Я обновил. Это позиция потока. – Aliostad

+0

Жаль уже пробовал это тоже, и это не имеет значения. Опять же, похоже, это происходит только для некоторых сайтов. Спасибо за помощь! – Dave

1

Я знал, что у вас есть ответ, который вам нужен, но я просто хочу продолжить свою оригинальную идею. Я думаю, что проблема в том, ваш массив каким-то образом был изменен и стал байтовый массив символов, нужно просто добавить этот код, чтобы он стал байтовый массив снова:

for (int i=0;i<imageByteArray.Length;i++) 
{ 
    imageByteArray[i]=(byte) imageByteArray[i]; 
} 

Я имел эту проблему и решить ее с помощью этого решения , Удачи!

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