Sfortunatamente, non sembra essere semplice per JPEG. Si dovrebbe guardare la fonte allo strumento da riga di comando jhead
. Fornisce queste informazioni. Passando attraverso la fonte, vedrai la funzione ReadJpegSections
. Questa funzione analizza tutti i segmenti contenuti nel file JPEG per estrarre le informazioni desiderate. La larghezza e l'altezza dell'immagine si ottengono quando si elaborano i frame con un indicatore SOFn
.
vedo la fonte è di pubblico dominio, quindi te lo mostrerò il frammento che ottiene l'Info d'immagine:
static int Get16m(const void * Short)
{
return (((uchar *)Short)[0] << 8) | ((uchar *)Short)[1];
}
static void process_SOFn (const uchar * Data, int marker)
{
int data_precision, num_components;
data_precision = Data[2];
ImageInfo.Height = Get16m(Data+3);
ImageInfo.Width = Get16m(Data+5);
dal codice sorgente, è chiaro per me non esiste un unico colpo di testa " "con questa informazione. È necessario eseguire la scansione del file JPEG, analizzando ogni segmento, finché non si trova il segmento con le informazioni in esso desiderate. Questo è descritto nella wikipedia article:
immagine Un JPEG costituito da una sequenza di segmenti, ogni inizio con un marcatore, ognuno dei quali inizia con un byte 0xFF seguito da un byte che indica il tipo di indicatore è. Alcuni indicatori consistono solo di quei due byte; altri sono seguiti da due byte che indicano la lunghezza dei dati del payload specifici del marcatore che segue.
Un file JPEG è costituito da una sequenza di segmenti:
SEGMENT_0
SEGMENT_1
SEGMENT_2
...
Ogni segmento inizia con un pennarello 2 byte. Il primo byte è 0xFF
, il secondo byte determina il tipo del segmento. Questo è seguito da una codifica della lunghezza del segmento. All'interno del segmento sono dati specifici per quel tipo di segmento.
La larghezza e l'altezza dell'immagine si trovano in un segmento di tipo SOFn
o "Inizio frame [n]", dove "n" è un numero che significa qualcosa di speciale per un decodificatore JPEG. Dovrebbe essere sufficiente per cercare solo uno SOF0
e la sua designazione di byte è 0xC0
. Una volta trovato questo frame, puoi decodificarlo per trovare l'altezza e la larghezza dell'immagine.
Quindi la struttura di un programma per fare quello che vuoi sarebbe simile:
file_data = the data in the file
data = &file_data[0]
while (data not at end of file_data)
segment_type = decoded JPEG segment type at data
if (type != SOF0)
data += byte length for segment_type
continue
else
get image height and width from segment
return
Questo è essenzialmente la struttura si trovano in Michael Petrov's get_jpeg_size()
implementation.
Avete i dettagli di ciò che è contenuto nei file JPEG? Se lo hai, per favore includilo nella tua domanda. Dubito che il tuo metodo sopra funzionerà dato che all'inizio c'è generalmente un'intestazione e poi iniziano i valori effettivi dei pixel. Se hai bisogno solo delle informazioni di altezza e larghezza, credo che puoi ottenerlo leggendo da solo l'intestazione. – shrm
@mishr: sto parlando di 'file jpeg 'in generale. –
Capisco, ma la domanda è: sai qual è il formato per i file jpeg? O vuoi che lo troviamo per te? – shrm