2010-03-25 35 views
7

Tengo una gran cantidad de archivos jpeg con diferentes tamaños de imagen. Por ejemplo, aquí es los primeros 640 bytes como propuesta por hexdump de una imagen de tamaño 256 * 384 (píxeles):Obtener tamaño de imagen de JPEG desde su archivo binario

0000000: ffd8 ffe0 0010 4a46 4946 0001 0101 0048 ......JFIF.....H 
0000010: 0048 0000 ffdb 0043 0003 0202 0302 0203 .H.....C........ 
0000020: 0303 0304 0303 0405 0805 0504 0405 0a07 ................ 
0000030: 0706 080c 0a0c 0c0b 0a0b 0b0d 0e12 100d ................ 

que supongo que la información mus estar dentro de estas líneas. Pero no puedo ver qué bytes dan los tamaños correctamente. ¿Alguien puede ayudarme a encontrar los campos que contienen la información de tamaño?

Respuesta

10

De acuerdo con la sección Syntax and structure del JPEG page on wikipedia, el ancho y el alto de la imagen no parecen almacenarse en la imagen en sí o, al menos, no de una forma muy fácil de encontrar.


Aún así, citando JPEG image compression FAQ, part 1/2:

Asunto: [22] ¿Cómo puede mi extracto programa dimensiones de imagen desde un archivo JPEG ?

El encabezado de un archivo JPEG consiste en una serie de bloques, llamados "marcadores". La altura y el ancho de la imagen se almacenan en un marcador del tipo SOFn(Inicio del marco , escriba N).
Para encontrar SOFn , debe omitir los marcadores anteriores ; no es necesario que sepa qué es en los otros tipos de marcadores, solo use sus palabras de longitud para omitir las .
La lógica mínima necesaria es quizás una página de código C.
(Algunos personas han recomendado sólo la búsqueda para el par de bytes que representa SOFn, sin prestar atención a la estructura de bloques marcador . Esto no es seguro debido a un marcador antes podría contener el patrón SOFn, ya sea por casualidad o porque que contiene la imagen en miniatura JPEG comprimido . Si usted no sigue la estructura del marcador se va a recuperar tamaño de la imagen en miniatura en lugar del tamaño de la imagen principal .)
un ejemplo profusamente comentó en C se pueden encontrar en rdjpgcom.c en el IJ Distribución G (ver parte 2, elemento 15).
código de Perl se puede encontrar en wwwis, desde http://www.tardis.ed.ac.uk/~ark/wwwis/.

(Ergh, que enlazan parece roto ...)


Aquí hay una porción de código C que podría ayudarle, sin embargo: Decoding the width and height of a JPEG (JFIF) file

+0

Si ese es el caso, ¿cómo nautilus u otro visor de imágenes decide la resolución de la imagen? También parecen estar de acuerdo con el valor 256 * 384 para esa imagen – rajeshsr

+0

¡Muchas gracias! Lo he entendido ahora.greping 0xFFC0 parece funcionar, de todos modos, ¡entiendo el peligro involucrado allí! ¡Gracias de nuevo! ¡Por cierto, esta es mi primera publicación en stackoverflow! Muy sorprendido por la solidez y la precisión de la respuesta. ¡Gracias a todos! – rajeshsr

+0

De nada :-) ¡Diviértase! –

0

Esta función leerá propiedades JPEG

function jpegProps(data) {   // data is an array of bytes 
    var offset = 0; 
    while(off<data.length) { 
     while(data[off]==0xff) off++; 
     var mrkr = data[off]; off++; 

     if(mrkr==0xd8) continue; // SOI 
     if(mrkr==0xd9) break;  // EOI 
     if(0xd0<=mrkr && mrkr<=0xd7) continue; 
     if(mrkr==0x01) continue; // TEM 

     var len = ((data[off]<<8)|data[off+1])-2; off+=2; 

     if(mrkr==0xc0) return { 
      bpc : data[off],  // precission (bits per channel) 
      w : (data[off+1]<<8)|data[off+2], 
      h : (data[off+3]<<8)|data[off+4], 
      cps : data[off+5] // number of color components 
     } 
     off+=len; 
    } 
} 
Cuestiones relacionadas