图像预处理第1步:将256色图像转化为灰度图像

//图像预处理第1步:将256色图像转化为灰度图像
void CChildView::OnIMGPRC256ToGray() 
{    
    Convert256toGray(m_hDIB);    
    //在屏幕上显示位图
    CDC* pDC=GetDC();
    DisplayDIB(pDC,m_hDIB);    
}
/****************************************************************
* 函数名称:
*      Convert256toGray()
*
* 参数:
*     HDIB hDIB     -图像的句柄
*
*  返回值:
*        无
*
*  功能:
*     将256色位图转化为灰度图
*
***************************************************************/

void Convert256toGray(HDIB hDIB)
{
    LPSTR    lpDIB;
    
    // 由DIB句柄得到DIB指针并锁定DIB
    lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)hDIB);
    
    // 指向DIB象素数据区的指针
    LPSTR   lpDIBBits;    

    // 指向DIB象素的指针
    BYTE *    lpSrc;    

    // 图像宽度
    LONG    lWidth;    
    // 图像高度
    LONG      lHeight;    

    // 图像每行的字节数
    LONG    lLineBytes;    

    // 指向BITMAPINFO结构的指针(Win3.0)
    LPBITMAPINFO lpbmi;    

    // 指向BITMAPCOREINFO结构的指针
    LPBITMAPCOREINFO lpbmc;
    
    // 获取指向BITMAPINFO结构的指针(Win3.0)
    lpbmi = (LPBITMAPINFO)lpDIB;    

    // 获取指向BITMAPCOREINFO结构的指针
    lpbmc = (LPBITMAPCOREINFO)lpDIB;    

    // 灰度映射表
    BYTE bMap[256];
    
    // 计算灰度映射表(保存各个颜色的灰度值),并更新DIB调色板
    int    i,j;
    for (i = 0; i < 256; i ++)
    {
        // 计算该颜色对应的灰度值
        bMap[i] = (BYTE)(0.299 * lpbmi->bmiColors[i].rgbRed +

                         0.587 * lpbmi->bmiColors[i].rgbGreen +

                         0.114 * lpbmi->bmiColors[i].rgbBlue + 0.5);            
        // 更新DIB调色板红色分量
        lpbmi->bmiColors[i].rgbRed = i;    
        
        // 更新DIB调色板绿色分量
        lpbmi->bmiColors[i].rgbGreen = i;    
        
        // 更新DIB调色板蓝色分量
        lpbmi->bmiColors[i].rgbBlue = i;
            
        // 更新DIB调色板保留位
        lpbmi->bmiColors[i].rgbReserved = 0;

    }
    // 找到DIB图像象素起始位置
    lpDIBBits = ::FindDIBBits(lpDIB);
        
    // 获取图像宽度
    lWidth = ::DIBWidth(lpDIB);    

    // 获取图像高度
    lHeight = ::DIBHeight(lpDIB);    

    // 计算图像每行的字节数
    lLineBytes = WIDTHBYTES(lWidth * 8);    

// 更换每个象素的颜色索引(即按照灰度映射表换成灰度值)

//逐行扫描
for(i = 0; i < lHeight; i++)
{

  //逐列扫描
for(j = 0; j < lWidth; j++)
{
    // 指向DIB第i行,第j个象素的指针
    lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
            
    // 变换
    *lpSrc = bMap[*lpSrc];
}
}

//解除锁定
::GlobalUnlock ((HGLOBAL)hDIB);
}

运行效果:

posted @ 2016-04-19 14:44  Bobby0322  阅读(1960)  评论(0编辑  收藏  举报