是否可以用下面的语句来实现读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??
多谢了!
lpSrc =(char*) lpDIBBits + lLineBytes * (lHeight - 1 - i0) + j0;
r=(lpSrc&0xff)
g=(lpSrc&0xff00)>>8
b=(lpSrc&0xff0000)>>16
请该怎么样定义r,g,b??
多谢了!
r=GetValueR(lpSrc);
如果是24色真彩色,它每三位才表示一个像素,所以三位分别表示R、G、B,你把每位的值取出来就是了。
//返回获取数据的总数.
//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);
}
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
在wingdi中除了常用的COLORREF(包括B,G,R,RESERVED 4个字节),我更喜欢用RGBTRIPLE
不必去理会烦人的RESERVED字节,关于这个结构体的详细信息可以很容易的查到:)