VC++将位图中保存的图像灰化(附源码)

Posted dvlinker

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC++将位图中保存的图像灰化(附源码)相关的知识,希望对你有一定的参考价值。

       我们在屏幕截图时,先要截取整个桌面的图像保存到位图对象中,然后再对位图中的图像进行灰化处理。

       实现灰化的具体做法是,先调用GetDIBits获取位图中每个像素的RGB色块,然后对每个像素的RGB值做灰化处理(每个RGB值都乘以一个系数,完成灰化),然后再调用SetDIBits将灰化后的RGB块设置回位图对象中。相关代码如下所示:

void DoGrayBitmap()

	CUIString strLog;

	HDC hDC = GetDC( this->m_hWnd );
	ASSERT( hDC );
	if ( hDC == NULL )
	
		strLog.Format( _T("[DoGrayBitmap] GetDC失败, GetLastError: %d"), 
			GetLastError() );
		WriteLog( strLog );
		return;
	

	BITMAP bmp; 
	GetObject( m_hGrayBitmap, sizeof(bmp), &bmp );
	
	UINT *pData = new UINT[bmp.bmWidth * bmp.bmHeight]; 
	if ( pData == NULL )
	
		int nSize = bmp.bmWidth * bmp.bmHeight;
		strLog.Format( _T("[DoGrayBitmap]pData通过new申请%s字节的内存失败,直接return"), nSize );
		WriteLog( strLog );

		ReleaseDC( this->m_hWnd, hDC );
		return;
	

	BITMAPINFO bmpInfo; 
	bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
	bmpInfo.bmiHeader.biWidth = bmp.bmWidth; 
	bmpInfo.bmiHeader.biHeight = -bmp.bmHeight; 
	bmpInfo.bmiHeader.biPlanes = 1; 
	bmpInfo.bmiHeader.biCompression = BI_RGB; 
	bmpInfo.bmiHeader.biBitCount = 32; 

	int nRet = GetDIBits( hDC, m_hGrayBitmap, 0, bmp.bmHeight, pData, &bmpInfo, DIB_RGB_COLORS );
	if ( 0 == nRet )
	
		strLog.Format( _T("[DoGrayBitmap]GetDIBits失败 nRet == 0, GetLastError: %d"), 
			GetLastError() );
		WriteLog( strLog );
	

	UINT color, r, g, b; 
	for ( int i = 0; i < bmp.bmWidth * bmp.bmHeight; i++ ) 
	 
		color = pData[i]; 
		b = ( color << 8 >> 24 ) * 0.6; 
		g = ( color << 16 >> 24 ) * 0.6; 
		r = ( color << 24 >> 24 ) * 0.6; 
		pData[i] = RGB(r, g, b); 
	 

	// 如果函数成功,那么返回值就是复制的扫描线数;如果函数失败,那么返回值是0。
	nRet = SetDIBits( hDC, m_hGrayBitmap, 0, bmp.bmHeight, pData, &bmpInfo, DIB_RGB_COLORS ); 
	if ( 0 == nRet )
	
		strLog.Format( _T("[DoGrayBitmap]SetDIBits失败 nRet == 0, GetLastError: %d"), 
			GetLastError() );
		WriteLog( strLog );
	

	delete []pData;
	pData = NULL;
	ReleaseDC( this->m_hWnd, hDC ); 

以上是关于VC++将位图中保存的图像灰化(附源码)的主要内容,如果未能解决你的问题,请参考以下文章

VC++使用GDI+实现HBITMAP与图片文件之间的相互转换(附源码)

VC++如何将rc资源中的图片加载到MFC的CImage对象中(附源码)

VC++图片类型之间的相互转换(附源码)

VC++图片类型的识别(附源码)

VC++几种加载图片方法的讨论(附源码)

VC 中怎样将用 DirectDraw处理过的图像输出到BMP格式文件里?