当前位置: 网学 > 编程文档 > 其他类别 > 正文

BMP文件深入解析

来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/19
下载{$ArticleTitle}原创论文样式
unt=0;

inBmp.storeWidth =
4*((inBmp.bmpInfoH.biWidth*inBmp.bmpInfoH.biBitCount+31)/32);
inBmp.bmpFileH.bfSize =
54+4*colorCount+inBmp.storeWidth*inBmp.bmpInfoH.biHeight;

if ( 0 != colorCount )
{
inBmp.bmpRGB = new RGBQuad[colorCount];
fread(inBmp.bmpRGB,4,colorCount,inbmpF);
}
else
{
fread(&inBmp.bmpBitField,12,1,inbmpF);
}

inBmp.bmpInfoH.biSizeImage = inBmp.storeWidth*inBmp.bmpInfoH.biHeight;
inBmp.bmpData=new BYTE[inBmp.bmpInfoH.biSizeImage];

fseek(inbmpF,0-inBmp.bmpInfoH.biSizeImage,SEEK_END);
fread(inBmp.bmpData,inBmp.bmpInfoH.biSizeImage,1,inbmpF);
fclose(inbmpF);
return true;
}
}

三、颜色及亮度信息解析
biBitCount=1
表示位图最多有两种颜色,缺省情况下是黑色和白色,你也可以自己定义这两种颜色。图像信息头装调色板中将有两个调色板项,称为索引0和索引1。图象数据阵列中的每一位表示一个象素。如果一个位是0,显示时就使用索引0的RGB值,如果位是1,则使用索引1的RGB值。
biBitCount=4
表示位图最多有2^4=16种颜色。每个象素用4位表示,并用这4位作为彩色表的索引来查找该象素的颜色。例如,如果位图中的第一个字节为0x1A,它表示两个象素,第一象素的颜色就在彩色表的第2项中,而第二个象素的颜色就在彩色表的第11项中。调色板中缺省情况下会有16个RGB项,对应于索引0到索引15。
biBitCount=8
表示位图最多有2^8种颜色。每个象素用8位表示,并用这8位作为彩色表的索引来查找该象素的颜色。例如,如果位图中的第一个字节为0x1A,这个象素的颜色就在彩色表的第26项中。此时,缺省情况下,调色板中会有256个RGB,对应于索引0到索引255。
biBitCount=16
表示位图最多有2^16种颜色。每个像素用16位(2个字节)表示。这种格式叫作高彩色,或叫增强型16位色,或64K色。它的情况比较复杂,当biCompression成员的值是BI_RGB时,它没有调色板。16位中,最低的5位表示蓝色分量,中间的5位表示绿色分量,高的5位表示红色分量,一共占用了15位,最高的一位保留,设为0。这种格式也被称作555 16位位图。
如果biCompression成员的值是BI_BITFIELDS,(const DWORD BI_BITFIELDS = 3;)那么情况就复杂了,首先是原来调色板的位置被三个DWORD变量占据,称为红、绿、蓝掩码。分别用于描述红、绿、蓝分量在16位中所占的位置。在Windows 95(或98)中,系统可接受两种格式的位域:555和565,在555格式下,红、绿、蓝的掩码分别是:0x7C00、0x03E0、0x001F,而在565格式下,它们则分别为:0xF800、0x07E0、0x001F。你在读取一个像素之后,可以分别用掩码“与”上像素值,从而提取出想要的颜色分量(当然还要再经过适当的左右移操作)。在NT系统中,则没有格式限制,只不过要求掩码之间不能有重叠。(注:这种格式的图像使用起来是比较麻烦的,不过因为它的显示效果接近于真彩,而图像数据又比真彩图像小的多,所以,它更多的被用于游戏软件)。我们只需要读取其中的R或者G的掩码,来判断是那种格式。以红色掩码为例 0111110000000000的时候就是555格式 1111100000000000就是565格式。
555 格式 xrrrrrgggggbbbbb
565 格式 rrrrrggggggbbbbb
解析555格式的代码:
BYTE b= bmpData[i*storeWidth+j]&0x1F;
BYTE g=((bmpData[i*storeWidth+j +1]<<6)>>3)+(buffer[i*storeWidth+j]>>5);
BYTE r=(bmpData[i*storeWidth+j +1]<<1)>>3;
有一点值得提醒的是由于有较多的位操作,所以在处理的时候在前一次操作的上面加上一对括号。
现在我们得到了55RGB各自的分量,但是还有一个新的问题,那就是由于两字节表示了3个颜色 555下每个颜色最多到0x1F。所以我们需要一个转换,很简单将得
  • 上一篇资讯: 注册表的基础知识
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号