ºñÆ®¸ÊÀ» ·ÎµùÇÏ°í ÀúÀåÇÑ´Ù. ÀúÀåÀº 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/ |