2011-12-01 12 views
17

So che non esiste una funzione .Net che esiste per il controllo, ma esiste un algoritmo o un modo semplice ed efficace per verificare se un byte è un'immagine valida prima di utilizzare l'array di byte. Ho bisogno di questo perché sto inviando comandi diversi a un server che ascolta costantemente il client e uno dei comandi è quello di ottenere lo screenshot del computer del server.Come verificare se un array di byte è un'immagine valida?

+0

Ogni immagine ha un'intestazione in un determinato formato. Puoi sempre verificarlo. –

risposta

27

Si può provare a generare un'immagine dall'array di byte e controllare se il numero ArgumentException non lo è.

public static bool IsValidImage(byte[] bytes) 
{ 
    try { 
     using(MemoryStream ms = new MemoryStream(bytes)) 
      Image.FromStream(ms); 
    } 
    catch (ArgumentException) { 
     return false; 
    } 
    return true; 
} 
+8

Non penso che questo si qualifichi come "verifica prima di utilizzare l'array di byte" –

8

Come notato, provare a caricarlo in un'immagine è l'unico modo sicuro. È possibile controllare il numero di magia, ovvero l'intestazione del file in base al tipo di immagine [previsto]. Per esempio, i primi 8 ottetti di un file * .PNG sono, in esadecimale:

0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A 

http://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header

maggior parte degli altri tipi di file di immagine hanno numeri di magia simili.

Ma controllare che in realtà non ti dirà se il file è un file immagine valido. Tutto quello che saprai dopo è che il numero di magia sembra indicare che è un file di tipo X. Potrebbe ancora essere troncato o altrimenti corrotto, o anche essere qualcos'altro che capita solo di avere la giusta sequenza di ottetti nel posto giusto.

2

Per un JPEG è possibile verificare che i primi due byte siano 0xFF, 0xD8 e gli ultimi due siano 0xFF, 0xD9. Naturalmente è ancora possibile che i dati dell'immagine corrispondano al tag EOI, ma questo dovrebbe essere raro.

-1

Secondo me, se desideri solo ingresso di immagini (image Proper), allora si dovrebbe andare con accettare attributo del campo di input in questo modo:

input type = "file" name = id "UploadedFile" =" imageContent "class =" required "accept =" image/* "/>

Ciò fornirà solo immagini in ingresso. Quindi, puoi liberamente programmare per il back-end. Senza preoccuparsi dell'immagine è valida o meno.

E anche è possibile specificare specifico tipo di immagine se si desidera come:

input type = "file" name = "UploadedFile" id = "imageContent" class = "necessaria" accept = "image/jpeg, immagine/gif, image/png ">

+0

Si presume che l'utente sia un utente non malintenzionato, il browser supporti correttamente questi attributi correttamente e un paio di altre cose da considerare. Mantieni SEMPRE il tuo back-end il più possibile, poiché la validazione lato client è, purtroppo, inaffidabile. –

Problemi correlati