§ Заголовочный файл
unsigned short - 16 бит
unsigned int - 32 бит
1
2
3
4struct __attribute__((__packed__)) BITMAPFILEHEADER {
5 unsigned short bfType;
6 unsigned int bfSize;
7 unsigned short bfReserved1;
8 unsigned short bfReserved2;
9 unsigned int bfOffBits;
10};
11
12
13struct __attribute__((__packed__)) BITMAPINFOHEADER {
14 unsigned int biSize;
15 unsigned int biWidth;
16 unsigned int biHeight;
17 unsigned short biPlanes;
18 unsigned short biBitCount;
19 unsigned int biCompression;
20 unsigned int biSizeImage;
21 unsigned int biXPelsPerMeter;
22 unsigned int biYPelsPerMeter;
23 unsigned int biClrUsed;
24 unsigned int biClrImportant;
25};
§ Код для выгрузки BMP (16 Bit цвет)
- framebuffer - это массив байтов (320x240x0.5)
- Когда задается индексированная палитра (1,4 или 8 бит), то для нее обязательно строится таблица цветов
1struct BITMAPFILEHEADER head = {0x4D42, 38518, 0, 0, 0x76};
2struct BITMAPINFOHEADER info = {0x28, 320, 240, 1, 4, 0, 0x9600, 0xb13, 0xb13, 16, 0};
3
4unsigned char colors[64] =
5{
6
7 0x00, 0x00, 0x00, 0x00,
8 0xc0, 0x00, 0x00, 0x00,
9 0x00, 0x00, 0xc0, 0x00,
10 0xc0, 0x00, 0xc0, 0x00,
11 0x00, 0xc0, 0x00, 0x00,
12 0xc0, 0xc0, 0x00, 0x00,
13 0x00, 0xc0, 0xc0, 0x00,
14 0xc0, 0xc0, 0xc0, 0x00,
15 0x00, 0x00, 0x00, 0x00,
16 0xff, 0x00, 0x00, 0x00,
17 0x00, 0x00, 0xff, 0x00,
18 0xff, 0x00, 0xff, 0x00,
19 0x00, 0xff, 0x00, 0x00,
20 0xff, 0xff, 0x00, 0x00,
21 0x00, 0xff, 0xff, 0x00,
22 0xff, 0xff, 0xff, 0x00
23};
24
25FILE* fp = fopen("output.bmp", "wb");
26fwrite(&head, 1, sizeof(struct BITMAPFILEHEADER), fp);
27fwrite(&info, 1, sizeof(struct BITMAPINFOHEADER), fp);
28fwrite(&colors, 1, 64, record_file);
29fwrite(framebuffer, 1, 160*240, fp);
30fclose(fp);
§ Важная особенность
При записи в BMP, записывать надо сначала последнюю строку, и по убыванию. То есть, вначале идет самая последняя строка изображения (сверху вниз), но по горизонтали всё в порядке (слева направо).