Come posso prendere un array di byte di un'immagine TIFF e di trasformarlo in un Sistema.Di disegno.Oggetto immagine?

StackOverflow https://stackoverflow.com/questions/32750

  •  09-06-2019
  •  | 
  •  

Domanda

Ho un byte[] array, i cui contenuti rappresentano un file TIFF (e come, se scrivo questi byte direttamente in un file utilizzando l' BinaryWriter oggetto, forma perfettamente valido file TIFF) e sto cercando di trasformarlo in un Sistema.Di disegno.Immagine oggetto in modo che posso usare per la successiva manipolazione (alimentazione in un TIFF multipagina oggetto)

Il problema che sto avendo è che comunemente accettato il codice per questo compito:

    public Image byteArrayToImage(byte[] byteArrayIn)
    {
        MemoryStream ms = new MemoryStream(byteArrayIn);
        Image returnImage = Image.FromStream(ms, true);
        return returnImage;
    }

non funziona per me.La seconda riga del metodo di cui sopra, dove si chiama il Image.FromStream metodo muore in fase di runtime, dicendo

Parameter Not Valid

Credo che il metodo è soffocamento sul fatto che questo è un file TIFF ma non riesco a capire come fare il FromStream metodo di accettare questo fatto.

Come faccio a trasformare un array di byte di un file TIFF in un oggetto Immagine?

Inoltre, come ho detto, l'obiettivo finale di questo è quello di avere un array di byte che rappresenta un file TIFF multipagina, che contiene i file TIFF per la quale ho un byte array di oggetti di adesso.Se c'è un modo molto migliore per andare a fare questo, io sono tutto per esso.

È stato utile?

Soluzione

Edit: Il presupposto di seguito non è corretto, ho avuto la possibilità di accendere il mio IDE seguito e provato con e senza Scrivere e sia popolato MemoryStream correttamente.

Penso che avete bisogno di scrivere la vostra MemeoryStream prima.

Come se la mia memoria (no pun intended) non mi inganna questo:

MemoryStream ms = new MemoryStream(byteArrayIn);

Crea un flusso di memoria di dimensione.

È quindi necessario scrivere la matrice di byte contenuti per il flusso di memoria:

ms.Write(byteArrayIn, 0, byteArrayIn.Length);

Vedere se si risolve.

Altri suggerimenti

OK, ho trovato il problema, e da una parte del codice correlato a la parte di codice che stavo chiedendo.I dati che è stato in passato come stringa, ero a convertirlo in un array di byte (questo è stato un banco di prova così stavo cercando di simulare l'array di byte che ho l'app principale), quindi la conversione che per un MemoryStream, quindi la creazione di un'Immagine a partire da quello.

Quello che non mi rendevo conto era che la stringa è stato codificato in Base64.Chiamata Convert.FromBase64String() la fece girare in una matrice di byte che non uccidere il Image.FromStream() metodo.

Quindi in pratica è bollito giù per un errore stupido da parte mia.Ma hey, il codice di cui sopra è ancora utile e questa pagina probabilmente servire come un risultato di Google su come evitare questo errore a qualcun altro.

Inoltre, ho trovato un modo semplice per costruire un Multi-Page TIFF dal mio matrici di byte qui.

Tutti questi sono indizi che mi hanno aiutato a capire il mio problema, che è stato lo stesso problema di domanda.Quindi, voglio postare la mia soluzione che mi è arrivato a causa di questi indizi utili.Grazie per tutti i suggerimenti postati finora!

Quanto Tempo Saunders inviato nella sua risposta, che il metodo di Scrittura per scrivere un byte per il flusso di memoria è essenziale.Che è stato il mio primo errore.

Quindi i miei dati erano male i dati TIFF troppo, ma nel mio caso, ho avuto un extra di carattere 13 all'inizio della mia immagine.Una volta che ho rimosso, tutto ha funzionato bene per me.

Quando ho letto di alcuni di base formato di file TIFF, specifiche, ho trovato che il TIFF file deve iniziare con II o MM (due byte con valori di 73 77).II little-endian byte order ('Intel ordine dei byte') è usato.MM significa grande-finale ('Motorola ordine dei byte') è usato.I successivi due byte sono due byte valore intero ( = Int16 .NET) di 42, binario 101010.

Pertanto, una corretta TIFF stream di byte inizia con il separatore decimale i valori di byte di:73, 73, 42, 0 o 77, 77, 0, 42.Incoraggio chiunque con lo stesso problema che abbiamo sperimentato per ispezionare il formato di dati di flusso di byte e di assicurarsi che i vostri dati siano validi i dati TIFF!

Grazie Schnapple e Tim Saunders!!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top