大家看看这样读取对吗?
LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
/ 指向DIB象素指针
LPSTR   lpDIBBits;
// 指向DIB象素的指针
BYTE * lpSrc;
// 指向BITMAPINFO结构的指针(Win3.0)
LPBITMAPINFO lpbmi;
// 指向BITMAPCOREINFO结构的指针
LPBITMAPCOREINFO lpbmc;
// 表明是否是Win3.0 DIB的标记
BOOL bWinStyleDIB;
WORD wNumColors;
wNumColors = ::DIBNumColors(lpDIB);
// 判断是否是8-bpp位图
if (wNumColors != 256)
{
// 提示用户
MessageBox("非256色位图!", "系统提示" , MB_ICONINFORMATION | MB_OK);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
// 更改光标形状
BeginWaitCursor();
// 获取指向BITMAPINFO结构的指针(Win3.0)
lpbmi = (LPBITMAPINFO)lpDIB;
// 获取指向BITMAPCOREINFO结构的指针
lpbmc = (LPBITMAPCOREINFO)lpDIB;
// 判断是否是WIN3.0的DIB
bWinStyleDIB = IS_WIN30_DIB(lpDIB);
for (int  i = 0; i < 256; i ++)
{
   if (bWinStyleDIB)
  {
// 计算该颜色对应的灰度值

r[i]=(BYTE)(lpbmi->bmiColors[i].rgbRed);
g[i]=(BYTE)(lpbmi->bmiColors[i].rgbGreen);
b[i]=(BYTE)(lpbmi->bmiColors[i].rgbBlue);
  }
else
 {
r[i]=(BYTE)(lpbmi->bmiColors[i].rgbRed);
g[i]=(BYTE)(lpbmi->bmiColors[i].rgbGreen);
b[i]=(BYTE)(lpbmi->bmiColors[i].rgbBlue);
 }
}

解决方案 »

  1.   

    r[i]=(BYTE)(lpbmi->bmiColors[i].rgbRed);
    g[i]=(BYTE)(lpbmi->bmiColors[i].rgbGreen);
    b[i]=(BYTE)(lpbmi->bmiColors[i].rgbBlue);
      }
    else
     {
    r[i]=(BYTE)(lpbmi->bmiColors[i].rgbRed);
    g[i]=(BYTE)(lpbmi->bmiColors[i].rgbGreen);
    b[i]=(BYTE)(lpbmi->bmiColors[i].rgbBlue);这两个有什么区别!如果是读取对应的RGB值,应该是对的!// 计算该颜色对应的灰度值
    这个的话就不对了,应该有一个公式得出对应的灰度值的~
      

  2.   

    id CCh1_1View::OnFILE256ToGray() 
    {
    // 将256色位图转换成灰度图

    // 获取文档
    CCh1_1Doc* pDoc = GetDocument();

    // 指向DIB的指针
    LPSTR lpDIB;

    // 锁定DIB
    lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());

    // 颜色表中的颜色数目
    WORD wNumColors;

    // 获取DIB中颜色表中的颜色数目
    wNumColors = ::DIBNumColors(lpDIB);

    // 判断是否是8-bpp位图
    if (wNumColors != 256)
    {
    // 提示用户
    MessageBox("非256色位图!", "系统提示" , MB_ICONINFORMATION | MB_OK);

    // 解除锁定
    ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

    // 返回
    return;
    }

    // 更改光标形状
    BeginWaitCursor();

    // 指向DIB象素指针
    LPSTR   lpDIBBits;

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

    // 循环变量
    LONG i;
    LONG j;

    // 图像宽度
    LONG lWidth;

    // 图像高度
    LONG lHeight;

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

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

    // 指向BITMAPCOREINFO结构的指针
    LPBITMAPCOREINFO lpbmc;

    // 表明是否是Win3.0 DIB的标记
    BOOL bWinStyleDIB;

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

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

    // 灰度映射表
    BYTE bMap[256];

    // 判断是否是WIN3.0的DIB
    bWinStyleDIB = IS_WIN30_DIB(lpDIB);

    // 计算灰度映射表(保存各个颜色的灰度值),并更新DIB调色板
    for (i = 0; i < 256; i ++)
    {
    if (bWinStyleDIB)
    {
    // 计算该颜色对应的灰度值
    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;
    }
    else
    {
    // 计算该颜色对应的灰度值
    bMap[i] = (BYTE)(0.299 * lpbmc->bmciColors[i].rgbtRed +
         0.587 * lpbmc->bmciColors[i].rgbtGreen +
             0.114 * lpbmc->bmciColors[i].rgbtBlue + 0.5);

    // 更新DIB调色板红色分量
    lpbmc->bmciColors[i].rgbtRed = i;

    // 更新DIB调色板绿色分量
    lpbmc->bmciColors[i].rgbtGreen = i;

    // 更新DIB调色板蓝色分量
    lpbmc->bmciColors[i].rgbtBlue = i;
    }
    } // 找到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];
    }
    }

    // 替换当前调色板为灰度调色板
    pDoc->GetDocPalette()->SetPaletteEntries(0, 256, (LPPALETTEENTRY) ColorsTable[0]);

    // 设置脏标记
    pDoc->SetModifiedFlag(TRUE);

    // 实现新的调色板
    OnDoRealize((WPARAM)m_hWnd,0);

    // 更新视图
    pDoc->UpdateAllViews(NULL);

    // 解除锁定
    ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); // 恢复光标
    EndWaitCursor();
    }