读书人

关于16位bmp的读取有关问题

发布时间: 2013-07-01 12:33:04 作者: rapoo

关于16位bmp的读取问题
我做了一个程序用来读取bmp文件,可以读取1、4、8、16、24、32位的bmp文件,只有在处理16位图像的时候总是搞不对。

比如,我读出信息头,宽是211,高是256,图像总大小是108546。

在网上查到的资料,说bmp每行的字节数应该是4的倍数,但是108546显然不能被4除尽

我在处理其他类型的bmp位图时,每行的补全策略都是在每行的末尾平均补全的,也就是说:
补全的像素数 = (图像总像素数 - 宽 * 高 * 每像素的字节数) / 高

但是按这样的补全方式,108546显然不能做到每行平均

我修改了图像的宽,发现如果宽是奇数,就不用补全;如果宽是偶数,就在每行末尾补一个全零字,显示正常

以上这些都是在555方式下通过(而且我也不知道这种补全方式是不是普适的)

在565方式下情况又变了,信息区不是从第55字节处开始的,拿211来说吧,需要从信息头之后再向后读8个字才能读到信息区(因为是16位么,所以我创建的是字数组来保存像素信息),简直找不到规律了

请问各位大神,该如何处理16位bmp的行补全问题(我用PhotoShop CS5创建的16位bmp)

///////////////////////// 分割线 ////////////////////////

下面附上几个16位的bmp图像信息:
211 * 256,大小108546
210 * 256,大小107522
209 * 256,大小107522
208 * 256,大小106498
全部不能用4整除

///////////////////////// 分割线 //////////////////////////

结帖率比较低这个我比较无奈,因为发帖很少,这是我第三个帖子,前一个帖子拖了好久,问题没有解决但是还偶尔有回复,不舍得结帖。如果有大神对MFC基础类或CFileDialog类比较了解,方便的话可以给我指点一下,帖子地址:
http://bbs.csdn.net/topics/390468922 bmp 16位bmp 行补全
[解决办法]
其中有2个字节应该是其他讯息;应该是四字节对齐:及实际图形宽度是(16Bit色): ((width + 1) / 2 * 2) * height * 2,再加上2个字节的其他信息;您可以验证一下,和您给的数据是吻合的;
(注意:width和height必须为整型)
[解决办法]
biSizeImage的大小并不能正确反映实际占用的字节数。PS的保存的BMP比实际的BMP都要大2个字节。

biSizeImage常常都设置为0的。 这个对于读图软件来说不重要。

实际上是需要自己来根据图像的宽度来确定图像一行像素真正占用的字节数的。然后再从文件中读取对应的数据。

555 和 565不同时因为:

在16位的BMP系列格式中,555是比较特殊的,他的文件头只占用40个字节,而其他的16位都是56字节,也就是555格式没有mask部分。

[解决办法]

引用:
Quote: 引用:

其中有2个字节应该是其他讯息;应该是四字节对齐:及实际图形宽度是(16Bit色): ((width + 1) / 2 * 2) * height * 2,再加上2个字节的其他信息;您可以验证一下,和您给的数据是吻合的;
(注意:width和height必须为整型)

谢谢您的回复,但是您似乎没有计算完:
((210 + 1) / 2 * 2) * 256 * 2 = 108032 != 107522 - 2

而且这个规律只在555格式下成立,565格式下又不同了(但是图片大小没变化),按同样的方法进行行补全会出现图像的错位,这个原因您了解吗?

您搞错了,注意,我强调是整型了:
((210 + 1) / 2 * 2) * 256 * 2 = 107520
这是通常图形处理中的技巧(210 + 1) / 2 * 2 = 210,而不是211 !!!!
[解决办法]
引用:
Quote: 引用:

其中有2个字节应该是其他讯息;应该是四字节对齐:及实际图形宽度是(16Bit色): ((width + 1) / 2 * 2) * height * 2,再加上2个字节的其他信息;您可以验证一下,和您给的数据是吻合的;
(注意:width和height必须为整型)

谢谢您的回复,但是您似乎没有计算完:
((210 + 1) / 2 * 2) * 256 * 2 = 108032 != 107522 - 2

而且这个规律只在555格式下成立,565格式下又不同了(但是图片大小没变化),按同样的方法进行行补全会出现图像的错位,这个原因您了解吗?

555、565的计算是一样的。如果错位,您多数忘了我强调的是整型运算,您用整型再试试


[解决办法]

引用:
Quote: 引用:

其中有2个字节应该是其他讯息;应该是四字节对齐:及实际图形宽度是(16Bit色): ((width + 1) / 2 * 2) * height * 2,再加上2个字节的其他信息;您可以验证一下,和您给的数据是吻合的;
(注意:width和height必须为整型)

谢谢您的回复,但是您似乎没有计算完:
((210 + 1) / 2 * 2) * 256 * 2 = 108032 != 107522 - 2

而且这个规律只在555格式下成立,565格式下又不同了(但是图片大小没变化),按同样的方法进行行补全会出现图像的错位,这个原因您了解吗?


当然对于引申的8Bit LUT颜色:size = (( width + 3) / 4 * 4) * height,注意这里仍是整型运算

读书人网 >VC/MFC

热点推荐