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);
}
这是个将256彩色图像转为灰度图的程序,
我想将函数稍作改动为
void Convert256toGray(CDib*pDib)
定图片长与宽可以用 CSize sizeImage=pDib->GetDimensions();
lWidth=sizeImage.cx;
lHeight=sizeImage.cy;
代替。
但是HDIB就不知道如何处理了。由于我的CDib类中没有定义HDIB。所以不知道该如何更改使用这个函数??
请大侠们赐教!!

解决方案 »

  1.   

    按你cdib类中定义的pDib方式直接进行操作阿如果你cdib类中定义了图像头文件格式
    那直接pDib->BITMAPINFOHEADER
    或者类似的
    pDib->ImageHeight这种
      

  2.   

    传一个HDIB的参数就ok了!CDib pDib;
    pDib->Convert256toGray();
      

  3.   

    此问题已经解决。我将
    LPSTR lpDIB; 
    // 由DIB句柄得到DIB指针并锁定DIB 
    lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)hDIB); 更改为LPSTR lpDIB=(LPSTR)pDib->m_lpBMIH就可以了。