2010-03-25 10 views
7

Ho molti file jpeg con dimensioni dell'immagine diverse. Ad esempio, ecco i primi 640 byte come in esadecimale di un'immagine di dimensione 256 * 384 (pixel):Ottenere le dimensioni dell'immagine di JPEG dal suo file 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 ................ 

immagino le informazioni di formato mus essere all'interno di queste linee. Ma non riesco a vedere quali byte danno le dimensioni correttamente. Qualcuno può aiutarmi a trovare i campi che contengono le informazioni sulle dimensioni?

risposta

10

Secondo la sezione Syntax and structure dello JPEG page on wikipedia, la larghezza e l'altezza dell'immagine non sembrano essere memorizzate nell'immagine stessa o, almeno, in un modo che è abbastanza facile da trovare.


Eppure, citando JPEG image compression FAQ, part 1/2:

Oggetto: [22] Come può il mio estratto programma immagine dimensioni da un file JPEG ?

L'intestazione di un file JPEG è costituita da una serie di blocchi, denominati "marcatori". L'altezza e la larghezza dell'immagine vengono memorizzate in un indicatore di tipo SOFn(Inizio del Frame, tipo N).
Per trovare SOFn è necessario saltare i precedenti marcatori ; non devi sapere cosa sono gli negli altri tipi di indicatori, solo usa le loro parole di lunghezza per saltare su loro.
La logica minima necessaria è forse una pagina di codice C.
(Alcuni persone hanno raccomandato solo cercando per la coppia di byte che rappresenta SOFn, senza prestare attenzione alla struttura del blocco marcatore . Questo è pericoloso perché un marker prima potrebbe contenere il modello SOFn, per caso o perché contiene un'immagine JPEG compresso miniatura. Se non si segue struttura marcatore si recuperare dimensioni della miniatura al posto della dimensione principale dell'immagine .)
una profusione commentato esempio in C può essere trovato in rdjpgcom.c nell'IJ Distribuzione G (vedi parte 2, elemento 15).
Perl codice può essere trovato in wwwis, da http://www.tardis.ed.ac.uk/~ark/wwwis/.

(ergh, che puntano sembra rotto ...)


Ecco una porzione di codice C che potrebbe aiutare, però: Decoding the width and height of a JPEG (JFIF) file

+0

Se questo è il caso in cui nautilus o qualche altro visualizzatore di immagini decide la risoluzione dell'immagine? Anche loro sembrano concordare sul valore 256 * 384 per quell'immagine – rajeshsr

+0

Grazie mille! Ho capito ora.greping 0xFFC0 sembra funzionare, comunque capisco il pericolo coinvolto lì! Grazie ancora! A proposito, questo è il mio primo post su StackOverflow! Abbastanza sorpreso dalla solidità e dalla precisione della risposta. Grazie a tutti! – rajeshsr

+0

Prego :-) Buon divertimento! –

0

Questa funzione leggerà proprietà 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; 
    } 
} 
Problemi correlati