HBITMAP CreateGrayscaleIcon(IMAGEINFO *pImageInfo)
{
if (pImageInfo == NULL)
{
return NULL;
} HBITMAP hGrayImage = NULL;
HDC hMainDC = NULL, hMemDC1 = NULL, hMemDC2 = NULL;
BITMAP bmp;
HBITMAP hOldBmp1 = NULL, hOldBmp2 = NULL;
IMAGEINFO iiGray; hMainDC = ::GetDC(NULL);
hMemDC1 = ::CreateCompatibleDC(hMainDC);
hMemDC2 = ::CreateCompatibleDC(hMainDC);
if (hMainDC == NULL || hMemDC1 == NULL || hMemDC2 == NULL)
{
return NULL;
} if (::GetObject(pImageInfo->hbmImage, sizeof(BITMAP), &bmp))
{
DWORD dwWidth = pImageInfo->rcImage.right - pImageInfo->rcImage.left;
DWORD dwHeight = pImageInfo->rcImage.bottom - pImageInfo->rcImage.top; iiGray.hbmImage = ::CreateBitmap(dwWidth, dwHeight, bmp.bmPlanes, bmp.bmBitsPixel, NULL);
if (iiGray.hbmImage)
{
hOldBmp1 = (HBITMAP)::SelectObject(hMemDC1, pImageInfo->hbmImage);
hOldBmp2 = (HBITMAP)::SelectObject(hMemDC2, iiGray.hbmImage); COLORREF crPixel = 0;
BYTE byNewPixel = 0; for (DWORD y=0; y<dwHeight; y++)
{
for (DWORD x=0; x<dwWidth; x++)
{
crPixel = ::GetPixel(hMemDC1, x, y);
byNewPixel = (BYTE)((GetRValue(crPixel) * 0.299) + (GetGValue(crPixel) * 0.587) + (GetBValue(crPixel) * 0.114)); if (crPixel)
::SetPixel(hMemDC2, x, y, RGB(byNewPixel, byNewPixel, byNewPixel));
else
::SetPixel(hMemDC2, x, y, crPixel);
} // for
} // for ::SelectObject(hMemDC1, hOldBmp1);
::SelectObject(hMemDC2, hOldBmp2); iiGray.hbmMask = pImageInfo->hbmMask; ::GetObject(iiGray.hbmImage, sizeof(BITMAP), &bmp);
hGrayImage = ::CreateBitmapIndirect(&bmp);
} // if ::DeleteObject(iiGray.hbmImage);
} // if ::DeleteDC(hMemDC1);
::DeleteDC(hMemDC2);
::ReleaseDC(NULL, hMainDC); return hGrayImage;
}看看这段代码何处有误,按它产生的hGrayImage画出来是黑色的
{
if (pImageInfo == NULL)
{
return NULL;
} HBITMAP hGrayImage = NULL;
HDC hMainDC = NULL, hMemDC1 = NULL, hMemDC2 = NULL;
BITMAP bmp;
HBITMAP hOldBmp1 = NULL, hOldBmp2 = NULL;
IMAGEINFO iiGray; hMainDC = ::GetDC(NULL);
hMemDC1 = ::CreateCompatibleDC(hMainDC);
hMemDC2 = ::CreateCompatibleDC(hMainDC);
if (hMainDC == NULL || hMemDC1 == NULL || hMemDC2 == NULL)
{
return NULL;
} if (::GetObject(pImageInfo->hbmImage, sizeof(BITMAP), &bmp))
{
DWORD dwWidth = pImageInfo->rcImage.right - pImageInfo->rcImage.left;
DWORD dwHeight = pImageInfo->rcImage.bottom - pImageInfo->rcImage.top; iiGray.hbmImage = ::CreateBitmap(dwWidth, dwHeight, bmp.bmPlanes, bmp.bmBitsPixel, NULL);
if (iiGray.hbmImage)
{
hOldBmp1 = (HBITMAP)::SelectObject(hMemDC1, pImageInfo->hbmImage);
hOldBmp2 = (HBITMAP)::SelectObject(hMemDC2, iiGray.hbmImage); COLORREF crPixel = 0;
BYTE byNewPixel = 0; for (DWORD y=0; y<dwHeight; y++)
{
for (DWORD x=0; x<dwWidth; x++)
{
crPixel = ::GetPixel(hMemDC1, x, y);
byNewPixel = (BYTE)((GetRValue(crPixel) * 0.299) + (GetGValue(crPixel) * 0.587) + (GetBValue(crPixel) * 0.114)); if (crPixel)
::SetPixel(hMemDC2, x, y, RGB(byNewPixel, byNewPixel, byNewPixel));
else
::SetPixel(hMemDC2, x, y, crPixel);
} // for
} // for ::SelectObject(hMemDC1, hOldBmp1);
::SelectObject(hMemDC2, hOldBmp2); iiGray.hbmMask = pImageInfo->hbmMask; ::GetObject(iiGray.hbmImage, sizeof(BITMAP), &bmp);
hGrayImage = ::CreateBitmapIndirect(&bmp);
} // if ::DeleteObject(iiGray.hbmImage);
} // if ::DeleteDC(hMemDC1);
::DeleteDC(hMemDC2);
::ReleaseDC(NULL, hMainDC); return hGrayImage;
}看看这段代码何处有误,按它产生的hGrayImage画出来是黑色的
解决方案 »
- 线程跨类无法关闭的问题???
- 对话框鼠标动画
- 交换平时积累下来的函数或子程序,绝对是一个好的学习方法,至少免去了重复开发之苦
- VC++ADO编程问题(IDispatch error #3149)?
- 寻求图像处理高手,要懂得ORC识别技术,有酬金
- 关闭时报错问题
- com 组件如何从 dll 形式的转成 静态链接到 主程序里?
- 新手问题,关于_MSC_VER
- 求教,在线等待,关于工具条提示的问题!
- 关于复合控件的聚合问题
- 这个错误“error C2572: 'CMyDlg::CMyDlg' : redefinition of default parameter : parameter 1”怎么避免?
- 因位图太大,CreateBitmap()无法建立的问题
另外建议你在内存里面处理,用GetPixel,SetPixel很慢的。