Страницы

Поиск по вопросам

понедельник, 6 января 2020 г.

Создать программно bmp файл

#cpp #c #winapi


Смотрел решение данной проблемы на msdn и тут : C++ How to create a bitmap file

Создает файл с расширением .bmp но при этом в описании ничего нету, файл пишет что
поврежден. заголовок читал, смотрел, вроде то. пытался скопировать из bmp в bmp, если
полностью скопировать bmpFileHeader и bmpInfoHeader то работает. Также пробовал делать
еще некоторые манипуляции, перевернуть отразить. Похоже что я что то не так делаю с
заголовками

BITMAPFILEHEADER bmpFileHeader = { 0 };
BITMAPINFOHEADER bmpInfoHeader = { 0 };
RGBQUAD RGBcolor;
for (size_t i = 0; i < height*width; ++i)
    image[i].reserved = 0;
bmpFileHeader.bfType = 0x4d42;
bmpInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInfoHeader.biWidth = width;
bmpInfoHeader.biHeight = height;
bmpInfoHeader.biSizeImage = (DWORD)(bmpInfoHeader.biWidth * bmpInfoHeader.biHeight);
bmpInfoHeader.biPlanes = 1;
bmpInfoHeader.biBitCount = 8;
bmpInfoHeader.biCompression = BI_RGB;
bmpInfoHeader.biXPelsPerMeter = bmpInfoHeader.biYPelsPerMeter = 2000;

bmpFileHeader.bfSize = sizeof(BITMAPFILEHEADER)+bmpInfoHeader.biSize + bmpInfoHeader.biSizeImage;
bmpFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + bmpInfoHeader.biSize + sizeof(RGBQUAD);
for (size_t i = 0; i < height * width; ++i){
    fwrite(&image[i], sizeof(RGBQUAD), 1, output);
}

typedef struct RGB{
    BYTE rgbtBlue;
    BYTE rgbtGreen;
    BYTE rgbtRed;
    BYTE reserved;
};

    


Ответы

Ответ 1



bmpFileHeader.bfSize -- поле заполнено неверно, должно быть: bmpFileHeader.bfSize = sizeof(BITMAPINFOHEADER); bmpFileHeader.bfOffBits -- здесь вы оставляете место под 256 записей палитры -- непонятно зачем, потому что очевидно палитра вам тут не нужна и вы её точто не заполняете, а сразу пишете пиксели. Также обратите внимание, что изображение в bmp -- перевёрнутое, т.е. нижняя строка пикселов идёт первой, затем та что над ней итд. Вообще, нужно внимательно читать описание каждого поля. По вашему коду видно, что многое вы упустили. Вот описание структуры на русском: http://www.vsokovikov.narod.ru/New_MSDN_API/Bitmaps/str_bitmapinfoheader.htm В качестве примера работающего кода могу дать свой: https://github.com/nzeemin/ukncbtl/blob/master/util/BitmapFile.cpp -- функция BmpFile_SaveScreenshot() в самом начале файла. Проверьте поле biBitCount -- сейчас у вас оно показывает что цвет 8-битный, а заливаете вы 32-битные пиксели.

Комментариев нет:

Отправить комментарий