用win32将彩色24位Bitmap灰度化

如果用GetPixel和SetPixel效率是很低的。有一种直接操纵内存中的Bitmap的方法。首先创建一个DIB,将原图Bitblt过去,然后对像素位进行操作,将HBITMAP返回,就可以直接使用。要注意原先的HBITMAP一定要从占有中释放,否则,外面的HDC将无法选中处理后的HBITMAP。

HBITMAP Gray(HDC hDC, int x, int y, int iWidth, int iHeight )
{
	//定义图形大小
	int iPixel = 24;
	int iBytesPerPixel = iPixel/8;

	//图形格式参数
	LPBITMAPINFO lpbmih = new BITMAPINFO;
	lpbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	lpbmih->bmiHeader.biWidth = iWidth;
	lpbmih->bmiHeader.biHeight = iHeight;
	lpbmih->bmiHeader.biPlanes = 1;
	lpbmih->bmiHeader.biBitCount = iPixel;
	lpbmih->bmiHeader.biCompression = BI_RGB;
	lpbmih->bmiHeader.biSizeImage = 0;
	lpbmih->bmiHeader.biXPelsPerMeter = 0;
	lpbmih->bmiHeader.biYPelsPerMeter = 0;
	lpbmih->bmiHeader.biClrUsed = 0;
	lpbmih->bmiHeader.biClrImportant = 0;

	//创建位图数据
	BYTE *pBits;

	HDC hdcMem = CreateCompatibleDC(hDC);
	HBITMAP hBitMap = CreateDIBSection(hdcMem,lpbmih,DIB_RGB_COLORS,(void **)&pBits,NULL,0);
	HGDIOBJ hOld = SelectObject( hdcMem, hBitMap);

	::BitBlt( hdcMem, 0, 0, iWidth, iHeight, hDC, x, y, SRCCOPY);

	BYTE * pBitsCurrent;
	BYTE r,g,b,gray;

	int iBytesScanLine;

	iBytesScanLine = ((iBytesPerPixel * iWidth + 3)>>2)<<2;

	for (int j=0;j


 

你可能感兴趣的:(用win32将彩色24位Bitmap灰度化)