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

BMP文件深入解析

来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/19
下载{$ArticleTitle}原创论文样式
到的各颜色分量乘8就可以了。

以下是565格式时的数据分离:
BYTE b= bmpData[i*storeWidth+j]&0x1F;
BYTE g=((bmpData[i*storeWidth+j+1]<<5)>>2)+(buffer[i*storeWidth+j]>>5);
BYTE r=bmpData[i*storeWidth+j +1]>>3;

现在我们得到了565RGB各自的分量,但是仍然还有一个新的问题,565格式下最大的绿色分量也就0x3F。所以我们需要一个转换,很简单将得到的绿色分量乘以4,其余乘8就可以了。
biBitCount=24
表示位图最多有2^24种颜色。这种位图没有调色板。每3个字节代表一个象素,分别对应于颜色B、G、R。
biBitCount=32
表示位图最多有2^32种颜色。这种位图的结构与16位位图结构非常类似,当biCompression成员的值是BI_RGB时,它也没有调色板,32位中有24位用于存放RGB值,顺序是:最前一字节保留,红8位、绿8位、蓝8位。这种格式也被成为888 32位图。如果 biCompression成员的值是BI_BITFIELDS时,原来调色板的位置将被三个DWORD变量占据,成为红、绿、蓝掩码,分别用于描述红、绿、蓝分量在32位中所占的位置。在Windows 95(or98)中,系统只接受888格式,也就是说三个掩码的值将只能是:0xFF0000、0xFF00、0xFF。而在NT系统中,你只要注意使掩码之间不产生重叠就行。

在次,给出灰度与RGB颜色的关系公式:gray = 0.3*r+0.6*g+0.1*b。有了这些的知识,现在给出用上述c++位图读入函数读入的位图的灰度数组转换函数;

template<typename T>
inline T & fetch(T * array,DWORD width,DWORD row,DWORD col)
{
return array[(row)*width+(col)];
}

//------------------------------------------------
//将一幅图片的像素区,转换为灰度值数组
//------------------------------------------------
template<typename T>
bool tranToArray(CBmp & inBmp,T * pA)
{
}


四、压缩编码解析
BI_RGB(无压缩const DWORD BI_RGB = 0;)
无压缩格式,可用上面的程序直接解析。
BI_RLE8(8位位图的压缩const DWORD BI_RLE8 = 1;)
在这种情况下BITMAPINFOHEADER结构中的biCompression设置为BI_RLE8,.使用256色位图行程编码格式将位图进行压缩。这种压缩方式包括绝对方式和编码方式。

编码方式:
在此方式下每两个字节组成一个信息单元。第一个字节给出其后面相连的象素的个数。第二个字节给出这些象素使用的颜色索引表中的索引。例如:信息单元03 04,03表示其后的象素个数是3个,04表示这些象素使用的是颜色索引表中的第五项的值。压缩数据展开后就是04 04 04 .同理04 05 可以展开为05 05 05 05.
信息单元的第一个字节也可以是00,这种情况下信息单元并不表示数据单元,而是表示一些特殊的含义。这些含义通常由信息单元的第二个字节的值来描述。这些值在0x00到0x02之间。具体含义如下:00 本行结束 ;01 位图结束 ;02 象素位置增量,表示紧跟在这个字节后面的信息单元里的两个字节中所包含的无符号值指定了下个象素相对于当前象素的水平和垂直偏移量(相对方式的意义体现在此)。例如:00 02 06 08表示的含义是下一个象素的位值是从当前位置向右移动5个象素,向下移动8个象素(不是字节)。

绝对方式:
绝对方式的标志是第一个字节是0,第二个字节是0x03到0xff之间的值。第二个字节的值表示跟随其后面的象素的字节数目。每个字节都包含一个象素的颜色索引。 每个行程编码都必须补齐到字的边界。

BI_RLE4(4位位图压缩const DWORD BI_RLE4 = 2;)
这是BITMAPINFOHEADER的biCompression设置为BI_RLE4,使用16位行程编码格式进行位图压缩。压缩方式也包括编码方式和绝对方式。

编码方式:
4位压缩的编码方式跟8位的编码的压缩方式没有什么区别。每个信息单元也是由两个字节表示,第一个字节表示其后面所跟随的象素的个数。第二个字节表示

  • 上一篇资讯: 注册表的基础知识
  • 网学推荐

    免费论文

    原创论文

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