望高手能提供详细代码,多谢!

解决方案 »

  1.   

    /*************************************************************************
     *
     * 函数名称:
     *   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();
    }