新手求助解决如何提取像素点RGB值的问题
2006-01-26 14:17
411 查看
在已知
BITMAPINFO *Bitmap ;
BITMAPFILEHEADER bfh;
bmp头文件和信息飚的情况下!
bfh中可以提取出图片的大小和存储格式了!
但是如何提取出每个橡树点的RGB值呢?
假设定义x=100
Bitmap->bmiColors[100].rgbBlue;代表的是什么?
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO, FAR *LPBITMAPINFO, *PBITMAPINFO;
BITMAPINFO结构中的RGBQUAD bmiColors[1];代表的是什么?
希望高手指导!
bmiColors[1];代表的是像素的颜色组成。
bmiColors是在有调色板情况下才使用,如256色的时候
即使用索引,数据中只用用一个字节甚至更少就能代表一种颜色
RGB模式中,颜色分为RGB三个值,每个多有8个字节(16位色除外)
x=100
Bitmap->bmiColors[100].rgbBlue;代表的是调色板中index=100的蓝色值
其实只要对DIB有足够的了解,这是一个极其简单的问题!
我写的一个程序,还未经过调试和优化,权作参考:
/*************************************************************************
*
* GetPixelColor()
*
* Return Value:
*
* BOOL - whether the color of assigned pixel is acquired
*
* Parameters:
*
*CPoint ptLocation:the location of assigned pixel;
*
*COLORREF &clrPixel:the color of assigned pixel to be stored;
*
* Description:
*
*Get the color of assigned pixel. This function treat BI_RGB style BMP
* only.
*
*************************************************************************/
BOOL CBmp::GetPixelColor(CPoint ptLocation, COLORREF &clrPixel)
{
if( m_hBmp == NULL )
return FALSE;
CSize bmpSize;
GetBmpSize(bmpSize);
if( ptLocation.x < 0 || ptLocation.x >= bmpSize.cx ||
ptLocation.y < 0 || ptLocation.y >= bmpSize.cy )
return FALSE;
;LPBITMAPINFOHEADER lpBi = (LPBITMAPINFOHEADER) ::GlobalLock((HGLOBAL) m_hBmp);
if( lpBi == NULL )
{
::GlobalUnlock((HGLOBAL)m_hBmp);
return FALSE;
}
if( lpBi->biCompression != BI_RGB/* && lpBi->biCompression != BI_BITFIELDS*/ )
{
::GlobalUnlock((HGLOBAL)m_hBmp);
return FALSE;
}
LPSTR lpBmpBitsAddr = GetBmpBitsAddr();
int nRowLen = BMP_ROW_LEN(lpBi->biBitCount * lpBi->biWidth),
nPalIndex = (bmpSize.cy - ptLocation.y - 1) * nRowLen;//Row addr
switch( lpBi->biBitCount )
{
case 1:
nPalIndex += (ptLocation.x >> 3);//Col addr
nPalIndex = *(lpBmpBitsAddr + nPalIndex);
nPalIndex >>= ((ptLocation.x + 7) % 8);
nPalIndex &= 0x1;
m_pBmpPal->GetPaletteEntries((UINT)nPalIndex, 1, (LPPALETTEENTRY)clrPixel);
break;
case 4:
nPalIndex += (ptLocation.x >> 1);//Col addr
nPalIndex = *(lpBmpBitsAddr + nPalIndex);
nPalIndex >>= (ptLocation.x % 2);
nPalIndex &= 0x0f;
m_pBmpPal->GetPaletteEntries((UINT)nPalIndex, 1, (LPPALETTEENTRY)clrPixel);
break;
case 8:
nPalIndex += ptLocation.x;//Col addr
nPalIndex = *(lpBmpBitsAddr + nPalIndex);
nPalIndex &= 0xff;
m_pBmpPal->GetPaletteEntries((UINT)nPalIndex, 1, (LPPALETTEENTRY)clrPixel);
break;
case 16://Treat BI_RGB only:
nPalIndex += ptLocation.x << 1;//Col addr
nPalIndex = *(lpBmpBitsAddr + nPalIndex);
nPalIndex &= 0xffff;
clrPixel = RGB((nPalIndex >> 10) & 0x1f, (nPalIndex >> 5) & 0x1f, nPalIndex & 0x1f);
break;
case 24:
nPalIndex += ptLocation.x * 3;//Col addr
clrPixel = RGB(((BYTE)*(lpBmpBitsAddr + nPalIndex + 2)),
((BYTE)*(lpBmpBitsAddr + nPalIndex + 1)),
((BYTE)*(lpBmpBitsAddr + nPalIndex)));
break;
case 32://Treat BI_RGB only:
nPalIndex += ptLocation.x << 2;//Col addr
clrPixel = RGB(((BYTE)*(lpBmpBitsAddr + nPalIndex + 2)),
((BYTE)*(lpBmpBitsAddr + nPalIndex + 1)),
((BYTE)*(lpBmpBitsAddr + nPalIndex)));
break;
default:
break;
::GlobalUnlock((HGLOBAL)m_hBmp);
lpBmpBitsAddr = NULL;
lpBi = NULL;
return FALSE;
}
::GlobalUnlock((HGLOBAL)m_hBmp);
lpBmpBitsAddr = NULL;
lpBi = NULL;
return TRUE;
}
BITMAPINFO *Bitmap ;
BITMAPFILEHEADER bfh;
bmp头文件和信息飚的情况下!
bfh中可以提取出图片的大小和存储格式了!
但是如何提取出每个橡树点的RGB值呢?
假设定义x=100
Bitmap->bmiColors[100].rgbBlue;代表的是什么?
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO, FAR *LPBITMAPINFO, *PBITMAPINFO;
BITMAPINFO结构中的RGBQUAD bmiColors[1];代表的是什么?
希望高手指导!
bmiColors[1];代表的是像素的颜色组成。
bmiColors是在有调色板情况下才使用,如256色的时候
即使用索引,数据中只用用一个字节甚至更少就能代表一种颜色
RGB模式中,颜色分为RGB三个值,每个多有8个字节(16位色除外)
x=100
Bitmap->bmiColors[100].rgbBlue;代表的是调色板中index=100的蓝色值
其实只要对DIB有足够的了解,这是一个极其简单的问题!
我写的一个程序,还未经过调试和优化,权作参考:
/*************************************************************************
*
* GetPixelColor()
*
* Return Value:
*
* BOOL - whether the color of assigned pixel is acquired
*
* Parameters:
*
*CPoint ptLocation:the location of assigned pixel;
*
*COLORREF &clrPixel:the color of assigned pixel to be stored;
*
* Description:
*
*Get the color of assigned pixel. This function treat BI_RGB style BMP
* only.
*
*************************************************************************/
BOOL CBmp::GetPixelColor(CPoint ptLocation, COLORREF &clrPixel)
{
if( m_hBmp == NULL )
return FALSE;
CSize bmpSize;
GetBmpSize(bmpSize);
if( ptLocation.x < 0 || ptLocation.x >= bmpSize.cx ||
ptLocation.y < 0 || ptLocation.y >= bmpSize.cy )
return FALSE;
;LPBITMAPINFOHEADER lpBi = (LPBITMAPINFOHEADER) ::GlobalLock((HGLOBAL) m_hBmp);
if( lpBi == NULL )
{
::GlobalUnlock((HGLOBAL)m_hBmp);
return FALSE;
}
if( lpBi->biCompression != BI_RGB/* && lpBi->biCompression != BI_BITFIELDS*/ )
{
::GlobalUnlock((HGLOBAL)m_hBmp);
return FALSE;
}
LPSTR lpBmpBitsAddr = GetBmpBitsAddr();
int nRowLen = BMP_ROW_LEN(lpBi->biBitCount * lpBi->biWidth),
nPalIndex = (bmpSize.cy - ptLocation.y - 1) * nRowLen;//Row addr
switch( lpBi->biBitCount )
{
case 1:
nPalIndex += (ptLocation.x >> 3);//Col addr
nPalIndex = *(lpBmpBitsAddr + nPalIndex);
nPalIndex >>= ((ptLocation.x + 7) % 8);
nPalIndex &= 0x1;
m_pBmpPal->GetPaletteEntries((UINT)nPalIndex, 1, (LPPALETTEENTRY)clrPixel);
break;
case 4:
nPalIndex += (ptLocation.x >> 1);//Col addr
nPalIndex = *(lpBmpBitsAddr + nPalIndex);
nPalIndex >>= (ptLocation.x % 2);
nPalIndex &= 0x0f;
m_pBmpPal->GetPaletteEntries((UINT)nPalIndex, 1, (LPPALETTEENTRY)clrPixel);
break;
case 8:
nPalIndex += ptLocation.x;//Col addr
nPalIndex = *(lpBmpBitsAddr + nPalIndex);
nPalIndex &= 0xff;
m_pBmpPal->GetPaletteEntries((UINT)nPalIndex, 1, (LPPALETTEENTRY)clrPixel);
break;
case 16://Treat BI_RGB only:
nPalIndex += ptLocation.x << 1;//Col addr
nPalIndex = *(lpBmpBitsAddr + nPalIndex);
nPalIndex &= 0xffff;
clrPixel = RGB((nPalIndex >> 10) & 0x1f, (nPalIndex >> 5) & 0x1f, nPalIndex & 0x1f);
break;
case 24:
nPalIndex += ptLocation.x * 3;//Col addr
clrPixel = RGB(((BYTE)*(lpBmpBitsAddr + nPalIndex + 2)),
((BYTE)*(lpBmpBitsAddr + nPalIndex + 1)),
((BYTE)*(lpBmpBitsAddr + nPalIndex)));
break;
case 32://Treat BI_RGB only:
nPalIndex += ptLocation.x << 2;//Col addr
clrPixel = RGB(((BYTE)*(lpBmpBitsAddr + nPalIndex + 2)),
((BYTE)*(lpBmpBitsAddr + nPalIndex + 1)),
((BYTE)*(lpBmpBitsAddr + nPalIndex)));
break;
default:
break;
::GlobalUnlock((HGLOBAL)m_hBmp);
lpBmpBitsAddr = NULL;
lpBi = NULL;
return FALSE;
}
::GlobalUnlock((HGLOBAL)m_hBmp);
lpBmpBitsAddr = NULL;
lpBi = NULL;
return TRUE;
}
相关文章推荐
- 新手求助:测试连接MYSQL时提示如下,请教问题出在哪?如何解决?
- 如何解决从word中提取图片粘贴后无法排版的问题
- [新手必读] 如何解决WP7同步软件Zune Software安装报错问题『史上最全』
- C中出现连接问题unresolved externals,如何解决,新手求指导
- 求助AS如何解决图片资源太大加载不出来的问题
- 移动WEB布局使用less语法之视网膜屏幕如何来解决图片像素问题
- 浏览器对于含小数值px(像素)解析的差异及小数值如何解决兼容性问题
- Linux C编程如何使用联机帮助来解决编程问题?
- 如何解决Kerberos问题: "Server has invalid Kerberos principal: hdfs/host2@****.COM"
- Spark技术内幕: 如何解决Shuffle Write一定要落盘的问题?
- 如何解决WordPress数据库连接错误问题
- 如何解决iOS界面操作导致导致NSTimer暂停计时的问题?
- VS.net2005写的程序如何在没有.Net FrameWork的机器上运行 --解决“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题”(转载)
- 如何更好的理解并解决问题
- 基于PLSQL的数据库备份方法及如何解决导出clob和blob类型数据报错的问题
- 解决双显卡笔记本安装XP系统后独立显卡无法驱动的问题!Win7双显卡笔记本换XP系统如何安装独立显卡驱动!
- 如何解决企业邮件对国外的通信问题
- 如何解决error C4996: 'fopen'的问题
- 社交产品如何解决前期零用户的问题