2010-11-18 2 views
7

Ho implementato la seguente funzionalità che si collega al servizio web e scarica una favicon da un determinato sito e la salva in un byte [] che memorizzo nel nostro Banca dati. Ora voglio configurarlo in modo che salvi l'icona sul disco. Comunque sto ricevendo un "Parameter is not valid" quando provo a creare l'immagine dal byte [].Creazione e salvataggio di un'immagine da un byte [] causa il parametro non è un'eccezione valida

Il mio codice è il seguente ..

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

L'eccezione si verifica sulla linea di mezzo.

Questo codice funziona perfettamente 9 volte su dieci, ma per alcune favicon, anche se l'icona è un'immagine valida (o almeno sembra essere e viene visualizzata nel browser quando si punta su di essa) Ricevo questa eccezione .

Qualcuno ha qualche idea? Sto tirando i miei capelli qui!

Grazie

Dave

Edit: Il valore nella matrice che sembra gettare l'errore è 127.

+0

Come stai raccogliendo questi file 'favicon'? Sei sicuro che il file esista sempre? Controllate per 'imageByteArray.Length == 0'? – Oded

+0

Sì, sono sicuro che l'array non è zero e quando salvi questa icona sul Db funziona perfettamente. – Dave

risposta

20

Non c'è alcuna necessità di mettere in un'immagine, sputa semplicemente i byte:

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

Perfetto, stavo davvero spendendo troppo tempo a pensare nella scatola. – Dave

+1

È meglio usare l'istruzione 'using' piuttosto che aprire e chiudere lo stream manualmente. – SepehrM

+0

Risposta perfetta !! – Rahnzo

0

Aggiungi formato di immagine:

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

L'eccezione lancia la linea prima, dalla riga Image.FromStream (stream); Sembra che il valore nella matrice di byte che esplode contiene 127 – Dave

+0

che ho aggiornato. È la posizione del flusso. – Aliostad

+0

Mi dispiace, ho già provato anche questo e non fa differenza. Ancora una volta, questo sembra accadere solo per alcuni siti. Grazie per l'aiuto! – Dave

1

Sapevo che avevi la risposta che ti serve ma voglio solo continuare la tua idea originale. Credo che il problema è il tuo array di byte in qualche modo era stato cambiato e diventare di byte array di caratteri, è sufficiente aggiungere questo codice per rendere diventa array di byte di nuovo:

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

Ho avuto questo problema e risolto da questa soluzione . In bocca al lupo!