2010-11-18 11 views
7

Mam zaimplementowaną następującą funkcjonalność, która łączy się z serwisem internetowym i pobiera favicon z danej witryny i zapisuje go do bajtu [], który przechowuję w naszym Baza danych. Teraz chcę skonfigurować go tak, aby zapisywał ikonę na dysku. Jednak otrzymuję komunikat "Parametr nie jest prawidłowy", gdy próbuję utworzyć obraz z bajtu [].Tworzenie i zapisywanie obrazu z bajtu [] powoduje, że parametr jest nieprawidłowy wyjątek

Mój kod wygląda następująco ..

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

Wyjątek występuje na linii środkowej.

Ten kod działa perfekcyjnie 9 razy na dziesięć, ale dla niektórych favikonów, nawet jeśli ikona jest poprawnym obrazem (a przynajmniej wygląda na to, że jest wyświetlana w przeglądarce, gdy wskazuje na to punkt), otrzymuję ten wyjątek .

Czy ktoś ma jakieś pomysły? Wyciągam tu włosy!

Dzięki

Dave

Edit: wartość w tablicy, która wydaje się rzucać błędu jest 127.

+0

W jaki sposób zbierasz te pliki 'favicon'? Czy na pewno plik istnieje? Czy sprawdzasz 'imageByteArray.Length == 0'? – Oded

+0

Tak, jestem pewien, że tablica nie jest równa zero i kiedy zapiszę tę ikonę do Db, to działa dobrze. – Dave

Odpowiedz

20

Nie ma potrzeby umieszczania na obraz, po prostu wypluj bajty prosto:

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

Idealnie, naprawdę spędzałem zbyt wiele czasu na myśleniu w pudełku. – Dave

+1

Lepiej używać instrukcji 'using' zamiast otwierać i zamykać strumień ręcznie. – SepehrM

+0

Doskonała odpowiedź !! – Rahnzo

0

Dodaj Format obrazu:

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

Wyjątek rzuca linię przed tym, z linii Image.FromStream (strumień); Wygląda na to, że wartość w tablicy bajtów, która wieje, zawiera 127 – Dave

+0

Mam zaktualizowane. Jest to pozycja strumienia. – Aliostad

+0

Niestety, już wypróbowałem to i nie ma to znaczenia. Ponownie wydaje się, że dzieje się tak tylko w przypadku niektórych witryn. Dzięki za pomoc! – Dave

1

Wiedziałem, że masz odpowiedź, której potrzebujesz, ale chcę tylko kontynuować twój pierwotny pomysł. Myślę, że problem jest twoja tablica bajtów jakoś został zmieniony i stać bajt char tablicę, wystarczy dodać ten kod, aby stać się tablica bajtów ponownie:

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

miałem ten problem i rozwiązać go przez tego rozwiązania . Powodzenia!