MFC 24位图转换成1位位图代码实现
时间: 2023-05-30 20:03:23 浏览: 82
以下是将MFC 24位图转换为1位位图的代码实现:
1. 首先,我们需要使用CImage类加载24位图像:
CImage img;
img.Load(_T("24bit.bmp"));
2. 然后,创建一个位图文件头和位图信息头,并根据需要设置宽度,高度和颜色深度:
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER bih;
bfh.bfType = 0x4d42;
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bfh.bfSize = bfh.bfOffBits + (img.GetWidth() * img.GetHeight());
bfh.bfReserved1 = 0;
bfh.bfReserved2 = 0;
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biWidth = img.GetWidth();
bih.biHeight = img.GetHeight();
bih.biPlanes = 1;
bih.biBitCount = 1;
bih.biCompression = BI_RGB;
bih.biSizeImage = ((img.GetWidth() + 31) & ~31) / 8 * img.GetHeight();
bih.biXPelsPerMeter = 0;
bih.biYPelsPerMeter = 0;
bih.biClrUsed = 0;
bih.biClrImportant = 0;
3. 创建一个位图文件并将文件头和信息头写入文件:
CFile file;
file.Open(_T("1bit.bmp"), CFile::modeWrite | CFile::modeCreate);
file.Write(&bfh, sizeof(BITMAPFILEHEADER));
file.Write(&bih, sizeof(BITMAPINFOHEADER));
4. 创建一个位图缓冲区,并将24位图像复制到缓冲区:
BYTE* pBits = new BYTE[bih.biSizeImage];
memset(pBits, 0, bih.biSizeImage);
CDC* pDC = CDC::FromHandle(img.GetDC());
pDC->StretchBlt(0, 0, img.GetWidth(), img.GetHeight(), img.GetDC(), 0, 0, img.GetWidth(), img.GetHeight(), SRCCOPY);
BITMAPINFO bmpInfo;
memset(&bmpInfo, 0, sizeof(BITMAPINFO));
bmpInfo.bmiHeader = bih;
bmpInfo.bmiHeader.biBitCount = 24;
int nRet = GetDIBits(pDC->GetSafeHdc(), (HBITMAP)img, 0, img.GetHeight(), pBits, &bmpInfo, DIB_RGB_COLORS);
5. 创建一个新的位图缓冲区,将24位图像转换为1位位图:
BYTE* pNewBits = new BYTE[bih.biSizeImage];
memset(pNewBits, 0, bih.biSizeImage);
for (int i = 0; i < bih.biSizeImage; i++)
{
BYTE b = pBits[i * 3];
BYTE g = pBits[i * 3 + 1];
BYTE r = pBits[i * 3 + 2];
if ((r + g + b) / 3 > 127)
{
pNewBits[i / 8] |= (1 << (7 - (i % 8)));
}
}
6. 将新的位图缓冲区写入位图文件:
file.Write(pNewBits, bih.biSizeImage);
7. 清除内存,关闭文件:
delete[] pBits;
delete[] pNewBits;
file.Close();
以上就是将MFC 24位图转换为1位位图的代码实现。