望高手能提供详细代码,多谢!
解决方案 »
- MFC为多个dlg里的listctrl添加变量不成功??
- 取得时间控件的值,并且分别取得年、月、日。如何和字符串类型的时间比较大小?
- 怎么打开磁盘文件,要求按打开按钮,就出现一个文本对话框选文件!选定文件后把文件路径记录下来!
- 如何在一个vc工程中添加一个dll??
- 求Visual C++ Windows Shell Programming
- 请问:CString类需要包含什么头文件?
- 关于Visual Studio C++ 6.0
- 关于服务进程创建子进程
- 当数据库中的数据变化时,怎样也让LISTVIEW中的数据跟着变?
- 小弟有个问提要请教各位大虾??
- vc 打开文件夹
- 如何获取局域网中的ip地址???
*
* 函数名称:
* ToGray()
*
* 参数:
* HDIB hDIB - 待处理的DIB
*
* 返回值:
* void - 无返回值
*
* 说明:
* 该函数将彩色位图转化为灰度图像。
*
************************************************************************/void CGrayProc::ToGray(HDIB hDIB)
{
// 循环变量
LONG i;
LONG j; // 指向DIB的指针
LPBYTE lpDIB;
// 指向DIB象素指针
LPBYTE lpDIBBits;
// 锁定DIB
lpDIB = (LPBYTE) ::GlobalLock((HGLOBAL) hDIB); // 找到DIB图像象素起始位置
lpDIBBits = m_clsDIB.FindDIBBits(lpDIB);
// 判断是否是24-bpp位图
if (m_clsDIB.DIBBitCount(lpDIB) != 24)
{
// 提示用户
MessageBox("请先将其转换为24位色位图,再进行处理!", "系统提示" , MB_ICONINFORMATION | MB_OK);
// 解除锁定
::GlobalUnlock((HGLOBAL) hDIB);
// 返回
return;
}
// 更改光标形状
BeginWaitCursor();
// DIB的宽度
LONG lWidth = m_clsDIB.DIBWidth(lpDIB);
// DIB的高度
LONG lHeight = m_clsDIB.DIBHeight(lpDIB);
// 计算图像每行的字节数
LONG lLineBytes = WIDTHBYTES(lWidth * 24); // 对各像素进行灰度转换
for (i = 0; i < lHeight; i ++)
{
for (j = 0; j < lLineBytes; j ++)
{
// 获取各颜色分量
unsigned char R = *((unsigned char *)lpDIBBits + lLineBytes * i + j);
j++;
unsigned char G = *((unsigned char *)lpDIBBits + lLineBytes * i + j);
j++;
unsigned char B = *((unsigned char *)lpDIBBits + lLineBytes * i + j); // 计算灰度值
unsigned char Y = (9798 * R + 19235 * G + 3735 * B) / 32768;
// 回写灰度值
*((unsigned char *)lpDIBBits + lLineBytes * i + j - 2) = Y;
*((unsigned char *)lpDIBBits + lLineBytes * i + j - 1) = Y;
*((unsigned char *)lpDIBBits + lLineBytes * i + j ) = Y;
}
} // 解除锁定
::GlobalUnlock((HGLOBAL) hDIB); // 恢复光标
EndWaitCursor();
}