8-битное чтение / запись файла BMP - PullRequest
0 голосов
/ 16 января 2020

У меня проблема с копированием файла bmp. Как загрузить его в память (с возможностью редактирования пикселей) и сохранить в другом месте? Без использования внешних библиотек.

Я прилагаю то, что мне удалось сделать. Функция загрузки, вероятно, работает правильно. Writer №.

Мне нужна помощь в создании функции записи. И возможная проверка функции чтения

#include <iostream>
#include <Windows.h>
#include <fstream>

using namespace std;

uint8_t* datBuff[2] = { nullptr, nullptr }; 
uint8_t* pixels = nullptr; 
BITMAPFILEHEADER* bmpHeader = nullptr; 
BITMAPINFOHEADER* bmpInfo = nullptr; 
int LoadBMP(const char* location);
int SaveNewBmp(const char* location);

int main()
{

}

int LoadBMP(const char* location) {

    std::ifstream file(location, std::ios::binary);
    if (!file)
    {
        std::cout << "Failure to open bitmap file.\n";

        return 1;
    }

    datBuff[0] = new uint8_t[sizeof(BITMAPFILEHEADER)];
    datBuff[1] = new uint8_t[sizeof(BITMAPINFOHEADER)];

    file.read((char*)datBuff[0], sizeof(BITMAPFILEHEADER));
    file.read((char*)datBuff[1], sizeof(BITMAPINFOHEADER));

    bmpHeader = (BITMAPFILEHEADER*)datBuff[0];
    bmpInfo = (BITMAPINFOHEADER*)datBuff[1];

    if (bmpHeader->bfType != 0x4D42)
    {
        std::cout << "File \"" << location << "\" isn't a bitmap file\n";
        return 2;
    }

    pixels = new uint8_t[bmpInfo->biSizeImage];

    file.seekg(bmpHeader->bfOffBits);
    file.read((char*)pixels, bmpInfo->biSizeImage);

    return 0;
}

int SaveNewBmp(const char* location) {
    std::ofstream file(location, std::ios::binary);
    if (!file)
    {
        std::cout << "Failure to open bitmap file.\n";

        return 1;
    }

    file.write((char*)datBuff[0], sizeof(BITMAPFILEHEADER));
    file.write((char*)datBuff[1], sizeof(BITMAPINFOHEADER));

    file.write((char*)pixels, bmpInfo->biSizeImage);
    return 0;
}

Есть идеи?

Я не могу использовать пользовательские библиотеки. Рассмотрим случай файла 8 бит на пиксель. Нет другого.

...