2010-03-20 6 views
6

Tengo flujos de datos en bruto de archivos de imágenes, como:biblioteca C++ para la lectura consciente de endian de los metadatos de flujo de archivos sin procesar?

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

Quiero analizar los encabezados de los diferentes formatos de imagen para la altura y anchura. ¿Hay una biblioteca portátil que puede leer enteros, largos, cortos, etc. del búfer/secuencia, convirtiendo para endianess como se especifica?

Me gustaría ser capaz de hacer algo como: short x = rawData.readLeShort(offset); o long y = rawData.readBeLong(offset)

Una mejor opción sería una biblioteca de imágenes metadatos portátil & ligero (sin el peso extra de una biblioteca de manipulación de imágenes) que puede funcionar en datos de imágenes sin formato. Descubrí que las bibliotecas Exif no son compatibles con png y gif.

Respuesta

0

No es tan difícil hacerlo usted mismo. Así es como se puede leer un poco endian número de 32 bits:

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

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

y leer un número endian 32 poco grande:

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

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

me generalizada que a esto: 'plantilla T mágica :: getLE (const char * data) const {valor T = 0; int bytes = sizeof (T); for (int i = 0; i Kache

+0

En realidad, el código anterior tiene un error. En lugar de desplazar 'chars' sobre uno a la vez, cambia' T' uno a la vez. Esto corrige que: 'plantilla T Magic :: getLE (const char * data) const {valor T = 0; int bytes = sizeof (T); unsigned char c; para (int i = 0; i Kache

Cuestiones relacionadas