Спецификации форматов файлов, как с ними работать?

Не надо сильно в ответах орать, как работать с файловыми спецификациями в C++?
Знание языка имеется, не имеется понимания спецификаций.
Дайте полезные tutorial-ы; reference-ы; sample code-ы и т.д.
Doc; pdf; rtf вроде понятно; больше интересуют графические.
  • Вопрос задан
  • 2837 просмотров
Решения вопроса 1
@Free_ze
Пишу комментарии в комментарии, а не в ответы
Мы имеем сырой поток байт, с помощью спецификаций и описанных структур мы можем определить откуда (с каким смещением и сколько по размеру) и каким образом вытаскивать данные.
Например, BMP-файл состоит из заголовка файла, длинной 14 байт (тип BITMAPFILEHEADER), в нем описан размер файла, его тип (сигнатура) и т.п..

typedef struct tagBITMAPFILEHEADER {
  WORD bfType; 
  DWORD bfSize; 
  WORD bfReserved1; 
  WORD bfReserved2; 
  DWORD bfOffBits; 
} BITMAPFILEHEADER;


за ним заголовок самого изображения BITMAPINFO, содержащий BITMAPINFOHEADER, который уже непосредственно хранит параметры картинки (ширину-высоту, цветовую глубину, признаки сжатия и т.п.)

typedef struct tagBITMAPINFO {
  BITMAPINFOHEADER bmiHeader; // тип описан далее
  RGBQUAD          bmiColors[1];
} BITMAPINFO, *PBITMAPINFO;

typedef struct tagBITMAPINFOHEADER {
  DWORD biSize;
  LONG  biWidth;
  LONG  biHeight;
  WORD  biPlanes;
  WORD  biBitCount;
  DWORD biCompression;
  DWORD biSizeImage;
  LONG  biXPelsPerMeter;
  LONG  biYPelsPerMeter;
  DWORD biClrUsed;
  DWORD biClrImportant;
} BITMAPINFOHEADER, *PBITMAPINFOHEADER;


А, собственно, данные изображения находятся начиная с BITMAPFILEHEADER.bfOffBits, чередуясь по каналам цвета, выравниваясь по границам памяти и т.п. Например, это описано на вики.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
GavriKos
@GavriKos
А зачем? Точнее так - а есть ли смысл изобретать велосипед? Если вам нужно уметь открывать файл определенного формата - то лучше поискать для него готовое решение. Для графики - ImageLib например. Сэкономите тонну нервных клеток.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы