BMP图象解析
2010-07-25 20:46:37 来源:WEB开发网三、颜色表和位图信息
颜色表用于说明位图中的颜色,有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。RGBQUAD结构的定义如下:
typedef struct tagRGBQUAD
{
BYTErgbBlue;// 蓝色的亮度(值范围为0-255)
BYTErgbGreen; // 绿色的亮度(值范围为0-255)
BYTErgbRed; // 红色的亮度(值范围为0-255)
BYTErgbReserved;// 保留,必须为0
} RGBQUAD;
位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:
typedef struct tagBITMAPINFO
四、数据读取和颜色分离
{
BITMAPINFOHEADER bmiHeader; // 位图信息头
RGBQUAD bmiColors[1]; // 颜色表
} BITMAPINFO;
Bmp文件有个重要特性,那就是对于数据区域而言,每行的数据它必须凑满4字节,如果没有满,则用冗余的数据来补齐。这个特性直接影响到我们读取位图数据的方法,因为在我们看来(x,y)的数据应该在 y*width+x这样的位置上 但是因为会有冗余信息 那么必须将width用width+该行的冗余量来处理,而由于位图文件有不同的位数,所以这样的计算也不尽相同。
1位:
for(int i=0; i<height; i++)
4位:
for(int j=0; j<width; j=j+8)
{
int k=7;
while(k>=0)
{
color[i][k+j]=buffer[n]%2;
buffer[n]=buffer[n]/2;
k--;
}
n++;
}int pitch;
if(width%8==0)
pitch=width;
else
pitch=width+8-width%8;
for(int i=0; i<height; i++)
for(int j=0; j<width; j++)
{
int index;
if(j%2==0)
index = buffer[(i*pitch+j)/2]/16;
if(j%2==1)
index = buffer[(i*pitch+j)/2]%16;
UCHAR r=quad[index].rgbRed;
UCHAR g=quad[index].rgbGreen;
UCHAR b=quad[index].rgbBlue;
8位:int pitch;
if(width%4==0)
{
pitch=width;
}
else
{
pitch=width+4-width%4;
}
index=buffer[y*pitch+x]; //因为8位位图的数据区域存放的是调色板索引值,所以只需读取这个index
更多精彩
赞助商链接