是否可以用下面的语句来实现读R、G、B的值??
lpSrc =(char*) lpDIBBits + lLineBytes * (lHeight - 1 - i0) + j0; 
r=(lpSrc&0xff)
g=(lpSrc&0xff00)>>8
b=(lpSrc&0xff0000)>>16
请该怎么样定义r,g,b??
多谢了!

解决方案 »

  1.   

    int r,g,b;
    r=GetValueR(lpSrc);
      

  2.   

    应该看图像的具体格式工,要是256色图,可以如上面的方法取RGB值,
    如果是24色真彩色,它每三位才表示一个像素,所以三位分别表示R、G、B,你把每位的值取出来就是了。
      

  3.   

    用宏 GetRValue, GetGValue, GetBValue,不就能取得R,G,B的值吗,干嘛要自己定义。
      

  4.   

    24位的bgr依次读出来//将所有格式的数据转换成DDB--32位数据, 存放于lpbyDdb32
    //返回获取数据的总数.
    //32位DDB数据按字节顺序:蓝色--绿色--红色--保留字节--
    DWORD  CDib::GetDdbData32(LPBYTE lpbyDdb32)
    {
    ASSERT(lpbyDdb32); //计算DIB位图中一行的字节量
    DWORD dwDibWidthBytes = GetDibWidthBytes(m_nWidth,  m_nBitCount); //转换成32位DDB后每行的大小, 注意每位4字节
    DWORD dwDdbWidthBytes =  m_nWidth * 4; if(m_nBitCount == 1)
    {
    //每行实际字节数, 8个像素对应一个字节.
    LONG nLineBytes = (m_nWidth + 7) / 8;
    BYTE abyBitMask[] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};

    //DIB位图数据的行头
    DWORD dwDibBaseIndex = (m_nHeight - 1) * dwDibWidthBytes;

    //DDB 32位位图数据的行头
    DWORD dwDdbBaseIndex = 0; for(LONG i = 0;i < m_nHeight;i++)
    {
    //指向DIB行数据的指针
    BYTE* pbyDibRaw = m_pBits + dwDibBaseIndex;

    //指向 DDB 32位位图的数据的指针
    BYTE* pbyDdbRaw = lpbyDdb32 + dwDdbBaseIndex;
    for(LONG j = 0;j < nLineBytes;j++)
    {
    //8个像素数据的索引值
    BYTE byBit8 =  *(pbyDibRaw++);
    for(int n = 0; n < 8;n++)
    {
    BYTE byBitSingle = (byBit8 & abyBitMask[n]) >> (7 - n);

    *(pbyDdbRaw++) = m_pRGBQuad[byBitSingle].rgbBlue; //蓝色
    *(pbyDdbRaw++) = m_pRGBQuad[byBitSingle].rgbGreen; //绿色
    *(pbyDdbRaw++) = m_pRGBQuad[byBitSingle].rgbRed; //红色
    pbyDdbRaw++; //保留**
    }
    }//end j
    dwDibBaseIndex -= dwDibWidthBytes;
    dwDdbBaseIndex += dwDdbWidthBytes;
    }//end i
    return (dwDdbWidthBytes * m_nHeight);
    }// end if(m_nBitCount == 1)
    else if(m_nBitCount == 4)
    {
    //每行实际字节数
    LONG nLineBytes = (m_nWidth + 1) / 2; //DIB位图数据的行头
    DWORD dwDibBaseIndex = (m_nHeight - 1) * dwDibWidthBytes;

    //DDB 32位位图数据的行头
    DWORD dwDdbBaseIndex = 0; for(LONG i = 0;i < m_nHeight;i++)
    {
    //指向DIB行数据的指针
    BYTE* pbyDibRaw = m_pBits + dwDibBaseIndex;

    //指向 DDB 32位位图的数据的指针
    BYTE* pbyDdbRaw = lpbyDdb32 + dwDdbBaseIndex;
    for(LONG j = 0;j < nLineBytes;j++)
    {
    //两个像素数据的索引值, 通过高四位和低四位
    BYTE byBit8 =  *(pbyDibRaw++);
    BYTE byBitHigh = (byBit8 & 0xF0) >> 4;
    BYTE byBitLow = (byBit8 & 0x0F);

    *(pbyDdbRaw++) = m_pRGBQuad[byBitHigh].rgbBlue; //蓝色
    *(pbyDdbRaw++) = m_pRGBQuad[byBitHigh].rgbGreen; //绿色
    *(pbyDdbRaw++) = m_pRGBQuad[byBitHigh].rgbRed; //红色
    pbyDdbRaw++; *(pbyDdbRaw++) = m_pRGBQuad[byBitLow].rgbBlue; //蓝色
    *(pbyDdbRaw++) = m_pRGBQuad[byBitLow].rgbGreen; //绿色
    *(pbyDdbRaw++) = m_pRGBQuad[byBitLow].rgbRed; //红色
    pbyDdbRaw++; }//end j
    dwDibBaseIndex -= dwDibWidthBytes;
    dwDdbBaseIndex += dwDdbWidthBytes;
    }//end i
    return (dwDdbWidthBytes * m_nHeight);
    }// end if(m_nBitCount == 4)
    else if(m_nBitCount == 8)
    {
    //DIB位图数据的行头
    DWORD dwDibBaseIndex = (m_nHeight - 1) * dwDibWidthBytes;

    //DDB 32位位图数据的行头
    DWORD dwDdbBaseIndex = 0;
    for(LONG i = 0;i < m_nHeight;i++)
    {
    //指向DIB行数据的指针
    BYTE* pbyDibRaw = m_pBits + dwDibBaseIndex;

    //指向 DDB 32位位图的数据的指针
    BYTE* pbyDdbRaw = lpbyDdb32 + dwDdbBaseIndex;
    for(LONG j = 0;j < m_nWidth;j++)
    {
    //一个像素数据的索引值
    BYTE byIndex = *(pbyDibRaw++); *(pbyDdbRaw++) = m_pRGBQuad[byIndex].rgbBlue; //蓝色
    *(pbyDdbRaw++) = m_pRGBQuad[byIndex].rgbGreen; //绿色
    *(pbyDdbRaw++) = m_pRGBQuad[byIndex].rgbRed; //红色 pbyDdbRaw++;
    }//end j
    dwDibBaseIndex -= dwDibWidthBytes;
    dwDdbBaseIndex += dwDdbWidthBytes;
    }//end i
    return (dwDdbWidthBytes * m_nHeight);
    }// end if(m_nBitCount == 8)
    else if(m_nBitCount == 16)
    {
    //DIB位图数据的行头
    DWORD dwDibBaseIndex = (m_nHeight - 1) * dwDibWidthBytes;

    //DDB 32位位图数据的行头
    DWORD dwDdbBaseIndex = 0;
    for(LONG i = 0;i < m_nHeight;i++)
    {
    //指向DIB行数据的指针
    BYTE* pbyDibRaw = m_pBits + dwDibBaseIndex;

    //指向 DDB 32位位图的数据的指针
    BYTE* pbyDdbRaw = lpbyDdb32 + dwDdbBaseIndex;
    for(LONG j = 0;j < m_nWidth;j++)
    {
    //记录一个像素点的24位颜色值(16位和32位模式均被转化为24位)
    BYTE* pbyRGB = new BYTE[3]; 
    WORD* pwDdbData_16 = (WORD*)(pbyDibRaw++); 
    GetRGB16(pbyRGB, pwDdbData_16); 
    pbyDibRaw++; *(pbyDdbRaw++) = pbyRGB[0]; //蓝色
    *(pbyDdbRaw++) = pbyRGB[1]; //绿色
    *(pbyDdbRaw++) = pbyRGB[2]; //红色 pbyDdbRaw++;
    delete[] pbyRGB;
    }//end j
    dwDibBaseIndex -= dwDibWidthBytes;
    dwDdbBaseIndex += dwDdbWidthBytes;
    }//end i
    return (dwDdbWidthBytes * m_nHeight);
    }
    else if(m_nBitCount == 24)
    {
    //DIB位图数据的行头
    DWORD dwDibBaseIndex = (m_nHeight - 1) * dwDibWidthBytes;

    //DDB 32位位图数据的行头
    DWORD dwDdbBaseIndex = 0;
    for(LONG i = 0;i < m_nHeight;i++)
    {
    //指向DIB行数据的指针
    BYTE* pbyDibRaw = m_pBits + dwDibBaseIndex;

    //指向 DDB 32位位图的数据的指针
    BYTE* pbyDdbRaw = lpbyDdb32 + dwDdbBaseIndex;
    for(LONG j = 0;j < m_nWidth;j++)
    {
    *(pbyDdbRaw++) = *(pbyDibRaw++); //蓝色
    *(pbyDdbRaw++) = *(pbyDibRaw++); //绿色
    *(pbyDdbRaw++) = *(pbyDibRaw++); //红色
    pbyDdbRaw++;
    }//end j
    dwDibBaseIndex -= dwDibWidthBytes;
    dwDdbBaseIndex += dwDdbWidthBytes;
    }//end i
    return (dwDdbWidthBytes * m_nHeight);
    }// end if(m_nBitCount == 24)
    else if(m_nBitCount == 32)
    {
    // memcpy(lpbyDdb32, m_pBits, dwDdbWidthBytes * m_nHeight);
    //DIB位图数据的行头
    DWORD dwDibBaseIndex = (m_nHeight - 1) * dwDibWidthBytes;

    //DDB 32位位图数据的行头
    DWORD dwDdbBaseIndex = 0;
    for(LONG i = 0;i < m_nHeight;i++)
    {
    //指向DIB行数据的指针
    BYTE* pbyDibRaw = m_pBits + dwDibBaseIndex;

    //指向 DDB 32位位图的数据的指针
    BYTE* pbyDdbRaw = lpbyDdb32 + dwDdbBaseIndex;
    for(LONG j = 0;j < m_nWidth;j++)
    {
    *(pbyDdbRaw++) = *(pbyDibRaw++); //蓝色
    *(pbyDdbRaw++) = *(pbyDibRaw++); //绿色
    *(pbyDdbRaw++) = *(pbyDibRaw++); //红色
    *(pbyDdbRaw++) = *(pbyDibRaw++);
    }//end j
    dwDibBaseIndex -= dwDibWidthBytes;
    dwDdbBaseIndex += dwDdbWidthBytes;
    }//end i
    return (dwDdbWidthBytes * m_nHeight);
    } return (m_nWidth * m_nHeight);
    }
      

  5.   

    CPoint point;
        GetCursorPos(&point);//get cursor pos    HDC hDC = ::GetDC(NULL);//lock paint DC
        COLORREF colorref = ::GetPixel(hDC, point.x, point.y);//get the cursor color
        
    CString Color_text;
        red = GetRValue(colorref);//store red color
        Color_text.Format("%d",red);
    SetDlgItemText(IDC_RED,Color_text);//display the color value
    green = GetGValue(colorref);//store green color
    Color_text.Format("%d",green);
    SetDlgItemText(IDC_GREEN,Color_text);//display the color value
    blue = GetBValue(colorref);//store blue color
    Color_text.Format("%d",blue);
    SetDlgItemText(IDC_BLUE,Color_text);//display the color value
      

  6.   

    : dingdang614(叮当) 说错了。颜色值应是B G R
      

  7.   

    本来上面说得很详细了,我补充一点
    在wingdi中除了常用的COLORREF(包括B,G,R,RESERVED 4个字节),我更喜欢用RGBTRIPLE
    不必去理会烦人的RESERVED字节,关于这个结构体的详细信息可以很容易的查到:)