WEB开发网
开发学院软件开发VC BMP图象解析 阅读

BMP图象解析

 2010-07-25 20:46:37 来源:WEB开发网   
核心提示:三、颜色表和位图信息颜色表用于说明位图中的颜色,有若干个表项,BMP图象解析(2),每一个表项是一个RGBQUAD类型的结构,定义一种颜色,而由于位图文件有不同的位数,所以这样的计算也不尽相同,RGBQUAD结构的定义如下:typedef struct tagRGBQUAD{BYTErgbBlue;// 蓝色的亮度(值

三、颜色表和位图信息

颜色表用于说明位图中的颜色,有若干个表项,每一个表项是一个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++)
  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++;
  }
4位: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

Tags:BMP 图象 解析

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接