Bitmap Load Save

ºñÆ®¸ÊÀ» ·ÎµùÇÏ°í ÀúÀåÇÑ´Ù.
ÀúÀåÀº 24bit Color·Î ºñ¾ÐÃàÀ¸·Î¸¸ ÇÑ´Ù.

#include <stdio.h>
#include <windows.h>

#define BMP_MARKER  ('B' + ('M' << 8))

bool SaveBitmap24bitColor(char* szPathName, void* lpBits, int w, int h)
{
    FILE* pFile;
    fopen_s(&pFile, szPathName, "wb");
    if (!pFile)
        return false;

    BITMAPINFOHEADER BMIH;
    BMIH.biSize = sizeof(BITMAPINFOHEADER);
    BMIH.biSizeImage = w * h * 3;

    BMIH.biSize = sizeof(BITMAPINFOHEADER);
    BMIH.biWidth = w;
    BMIH.biHeight = h;
    BMIH.biPlanes = 1;
    BMIH.biBitCount = 24;
    BMIH.biCompression = BI_RGB;
    BMIH.biSizeImage = w * h * 3;

    BITMAPFILEHEADER bmfh;
    int nBitsOffset = sizeof(BITMAPFILEHEADER) + BMIH.biSize;
    LONG imageSize = BMIH.biSizeImage;
    LONG lFileSize = nBitsOffset + imageSize;
    bmfh.bfType = BMP_MARKER;
    bmfh.bfOffBits = nBitsOffset;
    bmfh.bfSize = lFileSize;
    bmfh.bfReserved1 = bmfh.bfReserved2 = 0;

    UINT headerSize = (UINT)fwrite(&bmfh, 1, sizeof(BITMAPFILEHEADER), pFile);
    UINT infoSize = (UINT)fwrite(&BMIH, 1, sizeof(BITMAPINFOHEADER), pFile);

    UINT fileSize = (UINT)fwrite(lpBits, 1, imageSize, pFile);
    fclose(pFile);

    return true;
}

bool LoadBitmap(const char* filename, BITMAPINFOHEADER& bitmapInfo, unsigned char *& pImage)
{
    FILE* fp = NULL;
    fopen_s(&fp, filename, "rb");
    if (!fp)
        return false;

    BITMAPFILEHEADER bmfh;
    BITMAPINFOHEADER& bmih = bitmapInfo;

    if (fread(&bmfh, sizeof(BITMAPFILEHEADER), 1, fp) != 1)
    {
        fclose(fp);
        return false;
    }

    if (bmfh.bfType != BMP_MARKER)
    {
        fclose(fp);
        return false;
    }

    if (fread(&bmih, sizeof(BITMAPINFOHEADER), 1, fp) != 1)
    {
        fclose(fp);
        return false;
    }

    int width    = (int)bmih.biWidth;
    int height   = (int)bmih.biHeight;
    int bitCount = (int)bmih.biBitCount;

    int widthStride = (width * bitCount/8 + 3) & ~3;
    int imageSize = height * widthStride;

    int imageFileSize = 0;
    if (bitCount == 24)
        imageFileSize = imageSize;
    else
        imageFileSize = sizeof(RGBQUAD) * (1 << bitCount) + imageSize;

    pImage = new BYTE[imageFileSize];
    if (pImage == NULL)
    {
        fclose(fp);
        return false;
    }

    if(fread(pImage, 1, imageFileSize, fp) != imageFileSize)
    {
        delete[] pImage;
        pImage = NULL;
        fclose(fp);
        return false;
    }

    fclose(fp);
    return TRUE;
}

//24bit bitmap load save test
void main()
{
    BITMAPINFOHEADER bitmapInfo;
    unsigned char* pImage = NULL;
    LoadBitmap("test.bmp", bitmapInfo, pImage);

    SaveBitmap24bitColor("test24.bmp", pImage, bitmapInfo.biWidth, bitmapInfo.biHeight);
    if(pImage)
        delete [] pImage;

}

Âü°í)
https://thebook.io/006796/ch04/02/03_01/