2010-12-28 24 views
22

Tengo una matriz de bytes pequeños (menos de 25K) que recibo y decodizo como parte de un sobre de mensaje más grande. Algunas veces esta es una imagen, y cuando es e imagen, a veces es un jpg. No tengo información de contexto que no sea la matriz de bytes, y necesito identificar si es una imagen y si la imagen es de tipo jpg.¿Cómo identificar los contenidos de un byte [] es un jpeg?

¿Hay algún número mágico o bytes mágicos que existan al principio, al final o en algún desplazamiento que pueda observar para identificarlo?

Un ejemplo de mi código es el siguiente (de memoria, no c/p):

byte[] messageBytesAfterDecode = retrieveBytesFromEnvelope(); 
if(null != messageBytesAfterDecode && messageBytesAfterDecode > 0){ 
    if(areTheseBytesAJpeg(messageBytesAfterDecode)){ 
     doSomethingWithAJpeg(messageBytesAfterDecode) 
    }else{ 
     flagEnvelopeAsHavingBadContentInTheField(); 
    } 
} 

Realmente necesito lo que entraría en el método

areTheseBytesAJpeg(byte[] mBytes){} 

, o incluso un puntero a una especificación que lo detalla. Estoy esperando que hay una manera muy rápida de hacer esta determinación, ya que realmente no quiero leerlos en una imagen, etc.

Respuesta

43

de Wikipedia:

archivos de imagen JPEG comienzan con FF D8 y termina con FF D9.

http://en.wikipedia.org/wiki/Magic_number_(programming)

+1

todo google, incluso lo puso en los resultados: http://www.google.com/search?&q=jpg+magic+number – zsalzbank

+0

Nice. Déjame correr mis exámenes y ¡volveré! – Kylar

+0

que fue muy agradable! el mío era mitad wikipedia, mitad firefox. Debe ser lo que me está frenando. –

0

Un archivo JPG tiene una cabecera específica que se puede utilizar para determinar una muy buena probabilidad de que se trata de un archivo JPG. Sin embargo, no está claro si tendrá todo el archivo en la matriz de bytes.

De todos modos, aquí hay información específica sobre el encabezado: http://www.fastgraph.com/help/jpeg_header_format.html

5

Citando this wikipedia article:

archivos de imagen JPEG comienzan con FF D8 y extremo con FF D9. Los archivos JPEG/JFIF contienen el código ASCII para "JFIF" (4A 46 49 46) como una cadena terminada nula. Los archivos JPEG/Exif contienen el código ASCII para "Exif" (45 78 69 66) también como una cadena terminada nula , seguida de más metadatos sobre el archivo.

+0

Sin embargo, tenga en cuenta que algunos archivos JPEG no tienen ni 4A 46 49 46 ni 45 78 69 66 en esa posición (aunque la mayoría lo he visto). No soy un experto en esto, pero estoy mirando un JPEG que tiene 50 68 6F 74 en esa posición; eso corresponde al ASCII "Phot" en "Photoshop", aunque he guardado archivos JPEG de varias maneras a partir de Photoshop y no puedo replicar esto. (Photoshop, sin embargo, reconoce este archivo como JPEG, al igual que Windows y OS X.) Este archivo no contiene los marcadores JFIF ni Exif en ningún lado. Finalmente, el archivo comienza con FF D8 y termina con FF D9 (como debería ser, ya que es un JPEG). –

3

Muchos formatos se identifican por los llamados números mágicos. Estas son secuencias de bytes que se encuentran generalmente en la parte frontal del archivo para identificar si los siguientes datos binarios son realmente lo que usted cree que son. Una búsqueda rápida en google devolvió: http://www.linfo.org/magic_number.html y específicamente la cita:

"De manera similar, un número mágico comúnmente usado para archivos de imagen JPEG (Joint Photographic Experts Group) es 0x4A464946, que es el equivalente ASCII de JFIF (JPEG File Interchange Format) Sin embargo, los números mágicos JPEG no son los primeros bytes del archivo, sino que comienzan con el séptimo byte. Los ejemplos adicionales incluyen 0x4D546864 para archivos MIDI (Interfaz digital de instrumentos musicales) y 0x425a6831415925 para archivos comprimidos bzip2. "

+0

Jfif no es necesariamente lo mismo que jpeg. Aunque, lo que la mayoría de las personas quiere decir cuando dicen jpeg, es en realidad jfif, ya que suponen que usa YUV como formato de color. – onemasse

+1

Tenga en cuenta re @onemasse comentar, sin embargo, que muchos archivos JPEG son Exif, no JFIF, por ejemplo muchos archivos JPEG tomados con cámaras digitales, muchos archivos JPEG guardados de Photoshop (lo que significa que hay muchos archivos JPEG en la web), etc. Esto se basa en mi experiencia personal, pero hay más aquí: http://en.wikipedia.org/wiki/JPEG_File_Interchange_Format. –

5

Otra fuente de "conocimiento" sobre los números mágicos (incluso para archivos JPEG) es el archivo magic utilizado por el comando file de GNU/Linux.

Si ha instalado el comando file, entonces file --version le dirá dónde los archivos magic vidas, y se puede leer con un editor de texto ... y cuidadosa lectura de man 5 magic.

(Y el contenido del archivo magic confirmar los detalles de otras respuestas.)

6

Alguna información adicional acerca de otro formato de archivo con JPEG: inicial del archivo contiene estos bytes

BMP : 42 4D 
JPG : FF D8 FF EO 
PNG : 89 50 4E 47 
GIF : 47 49 46 38 

algo de código:

private static Boolean isJPEG(File filename) throws Exception { 
    DataInputStream ins = new DataInputStream(new BufferedInputStream(new FileInputStream(filename))); 
    try { 
     if (ins.readInt() == 0xffd8ffe0) { 
      return true; 
     } else { 
      return false; 

     } 
    } finally { 
     ins.close(); 
    } 
} 
+1

Cuando un archivo JPG usa JFIF o EXIF, la firma es diferente: En bruto: FF D8 FF DB; JFIF: FF D8 FF E0; EXIF: FF D8 FF E1 –

Cuestiones relacionadas