MFC 24位图转换成1位位图源码
时间: 2023-05-31 19:02:43 浏览: 95
以下是将MFC 24位图转换为1位位图的源代码:
// 获取24位图像素数据
CImage image;
image.Load(_T("24bit.bmp"));
BYTE* pSrc = (BYTE*)image.GetBits();
int nWidth = image.GetWidth();
int nHeight = image.GetHeight();
// 创建1位位图
CBitmap bitmap;
bitmap.CreateBitmap(nWidth, nHeight, 1, 1, NULL);
// 获取1位位图像素数据
BYTE* pDst = new BYTE[nWidth * nHeight / 8];
memset(pDst, 0, nWidth * nHeight / 8);
BITMAPINFOHEADER bih;
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biWidth = nWidth;
bih.biHeight = nHeight;
bih.biPlanes = 1;
bih.biBitCount = 1;
bih.biCompression = BI_RGB;
bih.biSizeImage = 0;
bih.biXPelsPerMeter = 0;
bih.biYPelsPerMeter = 0;
bih.biClrUsed = 0;
bih.biClrImportant = 0;
BITMAPINFO bi;
bi.bmiHeader = bih;
bi.bmiColors[0] = RGB(0, 0, 0);
bi.bmiColors[1] = RGB(255, 255, 255);
// 将24位图转换为1位位图
for (int i = 0; i < nHeight; i++)
{
for (int j = 0; j < nWidth; j++)
{
int nIndex = i * nWidth + j;
BYTE r = pSrc[nIndex * 3];
BYTE g = pSrc[nIndex * 3 + 1];
BYTE b = pSrc[nIndex * 3 + 2];
BYTE nGray = (r * 30 + g * 59 + b * 11) / 100;
if (nGray < 128)
{
pDst[i * ((nWidth + 31) / 32) + j / 8] |= (BYTE)(0x80 >> (j % 8));
}
}
}
// 将1位位图像素数据写入位图对象
CBitmap* pOldBitmap = dc.SelectObject(&bitmap);
SetDIBits(dc.GetSafeHdc(), (HBITMAP)bitmap.GetSafeHandle(), 0, nHeight, pDst, &bi, DIB_RGB_COLORS);
dc.SelectObject(pOldBitmap);
delete[] pDst;
注意:上述代码仅支持24位RGB格式的位图,如果需要支持其他格式的位图,需要根据实际情况进行修改。
阅读全文