2011-12-01 11 views
17

Sé que no existe la función .Net que existe para verificar, pero ¿existe un algoritmo o una manera fácil y efectiva de verificar si un byte es una imagen válida antes de usar la matriz de bytes? Lo necesito porque estoy enviando comandos diferentes a un servidor que escucha constantemente al cliente y uno de los comandos es obtener la captura de pantalla de la computadora del servidor.¿Cómo comprobar si una matriz de bytes es una imagen válida?

+0

Cada imagen tiene un encabezado en un formato determinado. Siempre puedes verificar eso. –

Respuesta

27

Puede tratar de generar una imagen desde la matriz de bytes y verificar el ArgumentException si no es así.

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

No creo que esto califique como "comprobación antes de usar el conjunto de bytes" –

8

Como se indica, intentar cargarlo en una imagen es la única manera a prueba de fallas. Puede verificar el número de magick aka encabezado de archivo basado en el tipo de imagen [esperado]. Por ejemplo, los primeros 8 octetos de un archivo * .png son, en hexadecimal:

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

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

La mayoría de los otros tipos de archivos de imagen tienen números de magia similares.

Pero comprobar eso no le dirá si el archivo es un archivo de imagen válido. Todo lo que sabrás después es que el número mágico parece indicar que es un archivo de tipo X. Todavía podría estar truncado o dañado de alguna otra forma, o incluso podría ser algo completamente diferente que tenga la secuencia correcta de octetos en el lugar correcto.

2

Para un archivo JPEG, puede verificar que los primeros dos bytes sean 0xFF, 0xD8 y los dos últimos sean 0xFF, 0xD9. Por supuesto, aún es posible que los datos de la imagen coincidan con la etiqueta EOI, pero esto debería ser raro.

-1

Según yo, si desea que sólo entrada de imagen (imagen adecuada), entonces hay que ir con aceptar atributo del campo de entrada de la siguiente manera:

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

Esto le dará solo imágenes en la entrada. Entonces, puedes codificar libremente para back-end. Sin preocuparse por si la imagen es válida o no.

E incluso se puede especificar el tipo de imagen específico si desea recibir:

input type = "file" name = id = clase "imageContent" "UploadedFile" = "required" accept = "image/jpeg, imagen/gif, image/png ">

+0

Esto supone que el usuario no es un usuario malintencionado, el navegador admite estos atributos correctamente y un par de otras cosas a tener en cuenta. SIEMPRE asegure su back-end tanto como sea posible, ya que la validación del lado del cliente es, lamentablemente, poco confiable. –

Cuestiones relacionadas