c ++ библиотека для чтения метаданных необработанных файловых потоков - PullRequest
6 голосов
/ 20 марта 2010

У меня есть необработанные потоки данных из файлов изображений, например:

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

Я хочу разобрать заголовки разных форматов изображения по высоте и ширине. Существует ли переносимая библиотека, которая может считывать целые, длинные, короткие и т. Д. Из буфера / потока, конвертируя для порядка байтов, как указано?

Я хотел бы иметь возможность сделать что-то вроде: short x = rawData.readLeShort(offset); или long y = rawData.readBeLong(offset)

Еще лучшим вариантом будет легкая и переносимая библиотека метаданных изображений (без дополнительного веса библиотеки манипуляций с изображениями), которая может работать с необработанными данными изображений. Я обнаружил, что библиотеки Exif там не поддерживают png и gif.

1 Ответ

0 голосов
/ 21 марта 2010

Это не так сложно сделать самому. Вот как вы можете прочитать 32-битное число с прямым порядком байтов:

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

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

и для чтения 32-разрядного числа с прямым порядком байтов:

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

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