MFC 24位图转换成单色位图代码
时间: 2023-05-30 16:04:05 浏览: 51
以下是将MFC 24位图转换为单色位图的示例代码:
CBitmap bmp24;
bmp24.LoadBitmap(IDB_BITMAP24); //加载24位图
BITMAPINFO bmi24;
ZeroMemory(&bmi24, sizeof(BITMAPINFO)); //清空结构体
bmi24.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmp24.GetBitmap(&bmi24.bmiHeader, sizeof(BITMAPINFOHEADER)); //获取24位图像素信息
//创建单色位图
BITMAPINFO bmi1;
ZeroMemory(&bmi1, sizeof(BITMAPINFO));
bmi1.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi1.bmiHeader.biWidth = bmi24.bmiHeader.biWidth;
bmi1.bmiHeader.biHeight = bmi24.bmiHeader.biHeight;
bmi1.bmiHeader.biPlanes = 1;
bmi1.bmiHeader.biBitCount = 1;
bmi1.bmiHeader.biCompression = BI_RGB;
//计算单色位图像素信息
BYTE* pBits24 = new BYTE[bmi24.bmiHeader.biSizeImage];
bmp24.GetBitmapBits(bmi24.bmiHeader.biSizeImage, pBits24);
BYTE* pBits1 = new BYTE[bmi1.bmiHeader.biSizeImage];
int rowWidth24 = ((bmi24.bmiHeader.biWidth * 24 + 31) / 32) * 4;
int rowWidth1 = ((bmi1.bmiHeader.biWidth * 1 + 31) / 32) * 4;
for (int y = 0; y < bmi24.bmiHeader.biHeight; y++)
{
for (int x = 0; x < bmi24.bmiHeader.biWidth; x++)
{
int index24 = y * rowWidth24 + x * 3;
int index1 = y * rowWidth1 + x / 8;
BYTE gray = (BYTE)(0.299 * pBits24[index24 + 2] + 0.587 * pBits24[index24 + 1] + 0.114 * pBits24[index24]); //计算灰度值
BYTE bit = gray > 128 ? 0 : 1; //将灰度值转为二值图像
pBits1[index1] |= (bit << (7 - x % 8)); //将二值图像写入单色位图
}
}
//创建单色位图
CBitmap bmp1;
bmp1.CreateBitmapIndirect(&bmi1, pBits1);
//释放内存
delete[] pBits24;
delete[] pBits1;
//显示单色位图
CDC* pDC = GetDC();
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap* pOldBmp = memDC.SelectObject(&bmp1);
pDC->BitBlt(0, 0, bmi1.bmiHeader.biWidth, bmi1.bmiHeader.biHeight, &memDC, 0, 0, SRCCOPY);
memDC.SelectObject(pOldBmp);
ReleaseDC(pDC);