2010-03-20 19 views
6

Ho flussi di dati grezzi da file di immagine, come:libreria C++ per la lettura di endian-aware dei metadati di flusso di file raw?

vector<char> rawData(fileSize); 
ifstream inFile("image.jpg"); 
inFile.read(&rawData[0]); 

voglio analizzare le intestazioni dei diversi formati di immagine per altezza e larghezza. Esiste una libreria portatile in grado di leggere inte, long, shorts, ecc. Dal buffer/stream, convertendo per endianess come specificato?

mi piacerebbe essere in grado di fare qualcosa di simile: short x = rawData.readLeShort(offset); o long y = rawData.readBeLong(offset)

un'ancora migliore opzione sarebbe un & libreria di metadati dell'immagine portatile leggero (senza il peso aggiuntivo di una libreria di manipolazione delle immagini) che può funzionare su dati immagine grezzi. Ho trovato che le librerie Exif là fuori non supportano png e gif.

risposta

0

Non è difficile da fare da soli. Ecco come si può leggere un po 'endian numero a 32 bit:

unsigned char buffer[4]; 
inFile.read(buffer, sizeof(buffer)); 

unsigned int number = buffer[0] + 
         (buffer[1] << 8) + 
         (buffer[2] << 16) + 
         (buffer[3] << 24); 

e di leggere un gran numero endian 32 bit:

unsigned char buffer[4]; 
inFile.read(buffer, sizeof(buffer)); 

unsigned int number = buffer[3] + 
         (buffer[2] << 8) + 
         (buffer[1] << 16) + 
         (buffer[0] << 24); 
+0

ho generalizzato che a questo: 'modello T Magia :: getLE (const char * data) const {valore T = 0; int bytes = sizeof (T); for (int i = 0; i Kache

+0

In realtà, il codice sopra ha un bug. Invece di spostare "caratteri" su uno alla volta, sposta "T" uno alla volta. Questo corregge: 'template T Magic :: getLE (const char * data) const {valore T = 0; int bytes = sizeof (T); carattere non firmato c; for (int i = 0; i Kache

Problemi correlati