Запись изображения BMP в чистом c/c ++ без других библиотек

В моем алгоритме я должен создать вывод информации. Я должен для записи булевой матрицы в bmp файле. Это должно быть изображение monocromic, где пиксель является белым, если матрица на таком элементе верна. Основной проблемой является bmp заголовок и как записать это.

39
задан kyle k 19 September 2013 в 17:45
поделиться

3 ответа

Без использования какой-либо другой библиотеки вы можете посмотреть формат файла BMP . Я реализовал это в прошлом, и это можно сделать без особых усилий.

Структуры растрового файла

Каждый файл растрового изображения содержит заголовок файла растрового изображения , заголовок информации о растровом изображении, таблицу цветов и массив байтов. что определяет биты растрового изображения. Файл имеет следующую форму:

BITMAPFILEHEADER bmfh;
BITMAPINFOHEADER bmih;
RGBQUAD aColors [];
BYTE aBitmapBits [];

... подробнее см. Формат файла

20
ответ дан 27 November 2019 в 02:13
поделиться

Обратите внимание, что строки сохраняются снизу вверх, а не наоборот.

Кроме того, строки развертки должны иметь длину в байтах, кратную четырем, для обеспечения этого следует вставить байты заполнения в конце строк.

7
ответ дан 27 November 2019 в 02:13
поделиться

Посмотрим, сработает ли это для вас ... В этом коде , У меня было 3 двумерных массива, называемых красным, зеленым и синим. Каждый был размером [ширина] [высота], и каждый элемент соответствовал пикселю - надеюсь, это имеет смысл!

FILE *f;
unsigned char *img = NULL;
int filesize = 54 + 3*w*h;  //w is your image width, h is image height, both int

img = (unsigned char *)malloc(3*w*h);
memset(img,0,3*w*h);

for(int i=0; i<w; i++)
{
    for(int j=0; j<h; j++)
    {
        x=i; y=(h-1)-j;
        r = red[i][j]*255;
        g = green[i][j]*255;
        b = blue[i][j]*255;
        if (r > 255) r=255;
        if (g > 255) g=255;
        if (b > 255) b=255;
        img[(x+y*w)*3+2] = (unsigned char)(r);
        img[(x+y*w)*3+1] = (unsigned char)(g);
        img[(x+y*w)*3+0] = (unsigned char)(b);
    }
}

unsigned char bmpfileheader[14] = {'B','M', 0,0,0,0, 0,0, 0,0, 54,0,0,0};
unsigned char bmpinfoheader[40] = {40,0,0,0, 0,0,0,0, 0,0,0,0, 1,0, 24,0};
unsigned char bmppad[3] = {0,0,0};

bmpfileheader[ 2] = (unsigned char)(filesize    );
bmpfileheader[ 3] = (unsigned char)(filesize>> 8);
bmpfileheader[ 4] = (unsigned char)(filesize>>16);
bmpfileheader[ 5] = (unsigned char)(filesize>>24);

bmpinfoheader[ 4] = (unsigned char)(       w    );
bmpinfoheader[ 5] = (unsigned char)(       w>> 8);
bmpinfoheader[ 6] = (unsigned char)(       w>>16);
bmpinfoheader[ 7] = (unsigned char)(       w>>24);
bmpinfoheader[ 8] = (unsigned char)(       h    );
bmpinfoheader[ 9] = (unsigned char)(       h>> 8);
bmpinfoheader[10] = (unsigned char)(       h>>16);
bmpinfoheader[11] = (unsigned char)(       h>>24);

f = fopen("img.bmp","wb");
fwrite(bmpfileheader,1,14,f);
fwrite(bmpinfoheader,1,40,f);
for(int i=0; i<h; i++)
{
    fwrite(img+(w*(h-i-1)*3),3,w,f);
    fwrite(bmppad,1,(4-(w*3)%4)%4,f);
}

free(img);
fclose(f);
50
ответ дан 27 November 2019 в 02:13
поделиться
Другие вопросы по тегам:

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