如何获得位图每个象素颜色的索引值,请高手指教,谢谢!!!

解决方案 »

  1.   

    BITMAP bm;
    m_pBitmap->LoadBitmap(IDB_GOLDWEAVE);
    m_pdcMemory->CreateCompatibleDC(&dc);
    m_pdcMemory->SelectObject(m_pBitmap);
    m_pBitmap->GetObject(sizeof(bm), &bm);
    WORD index=bm.bmPlanes;//不知道这个是不是你想要的。参数的意思MSDN这样解释:
    bmPlanes 
    Specifies the count of color planes. 
      

  2.   

    好象不是这个吧,现在我知道,bfSize为这个位图的字节总数,每个字节就存储了每个象素的颜色索引,但是不知道怎么获得每个字节,请高手指教,谢谢~!
      

  3.   

    颜色表一般是针对16位一下的图像而设置的,对于16位和16位以上的图像,由于其位图像素数据中直接对对应像素的RGB(A)颜色进行描述,因而省却了调色板。而对于16位一下的图像,由于其位图像素数据中记录的只是调色板索引值,因而需要根据这个索引到调色板去取得相应的RGB(A)颜色。颜色表的作用就是创建调色板。
    访问调色板对应结构体中的变量应该可以得到。具体的就自己搞吧
      

  4.   

    // 指向DIB的指针
    LPSTR lpDIB;

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


    // 锁定DIB
    lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_hDIB); // 找到DIB图像象素起始位置
    lpDIBBits = ::FindDIBBits(lpDIB); // 指向源图像的指针
    unsigned char* lpSrc;

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

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

    // 中间变量
    int fTemp;

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

    // 每行
    for(i = 0; i < (int)::DIBHeight(lpDIB); i++)
    {
    // 每列
    for(j = 0; j < (int)::DIBWidth(lpDIB); j++)
    {
    // 指向DIB第i行,第j个象素的指针
    lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (::DIBHeight(lpDIB) - 1 - i) + j;

    fTemp =索引值;

    // 判断是否超出范围
    if (fTemp > 255)
    {
    // 直接赋值为255
    *lpSrc = 255;
    }
    else if (fTemp < 0)
    {
    // 直接赋值为0
    *lpSrc = 0;
    }
    else
    {
    // 四舍五入
    *lpSrc = (unsigned char) (fTemp + 0.5);
    }
    }
    }
    ::GlobalUnlock((HGLOBAL) m_hDIB);
    其中将下列函数放入globals文件夹
    LPSTR WINAPI FindDIBBits(LPSTR lpbi)
    {
    return (lpbi + *(LPDWORD)lpbi + ::PaletteSize(lpbi));
    }
    DWORD WINAPI DIBHeight(LPSTR lpDIB)
    {
    // 指向BITMAPINFO结构的指针(Win3.0)
    LPBITMAPINFOHEADER lpbmi;

    // 指向BITMAPCOREINFO结构的指针
    LPBITMAPCOREHEADER lpbmc; // 获取指针
    lpbmi = (LPBITMAPINFOHEADER)lpDIB;
    lpbmc = (LPBITMAPCOREHEADER)lpDIB; // 返回DIB中图像的宽度
    if (IS_WIN30_DIB(lpDIB))
    {
    // 对于Windows 3.0 DIB,返回lpbmi->biHeight
    return lpbmi->biHeight;
    }
    else
    {

    // 对于其它格式的DIB,返回lpbmc->bcHeight
    return (DWORD)lpbmc->bcHeight;
    }
    }DWORD WINAPI DIBWidth(LPSTR lpDIB)
    {
    // 指向BITMAPINFO结构的指针(Win3.0)
    LPBITMAPINFOHEADER lpbmi;

    // 指向BITMAPCOREINFO结构的指针
    LPBITMAPCOREHEADER lpbmc; // 获取指针
    lpbmi = (LPBITMAPINFOHEADER)lpDIB;
    lpbmc = (LPBITMAPCOREHEADER)lpDIB; // 返回DIB中图像的宽度
    if (IS_WIN30_DIB(lpDIB))
    {
    // 对于Windows 3.0 DIB,返回lpbmi->biWidth
    return lpbmi->biWidth;
    }
    else
    {
    // 对于其它格式的DIB,返回lpbmc->bcWidth
    return (DWORD)lpbmc->bcWidth;
    }
    }