关于BITMAP文件格式的问题

hardboy_du 2004-09-21 09:21:44
看书上说BITMAP的每一行的字节数是4的倍数,那么是不是说,每一行都有一些冗余的数据
比如

11111110
11111110
11111110
11111110

(1 :有用;0 :没用)
...全文
295 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
hardboy_du 2004-10-10
  • 打赏
  • 举报
回复
up
hardboy_du 2004-10-09
  • 打赏
  • 举报
回复
各位,你们现在都在那工作啊
5will 2004-10-06
  • 打赏
  • 举报
回复
如果你已经得到8位的BMP,调色板已经定义好了,你把数据处理完直接写进就能出来图片了
如果你得到的是纯数据,那么8位的先要定义好调色版,它的信息头,文件头,数据,然后每行字节不为4的倍数的补上,这样显示就应该对了(HOHOZ怎么样显示,偶也不明白),是不是这样的,各位,我没做过纯数据的

hardboy_du 2004-10-06
  • 打赏
  • 举报
回复
高人真多啊
hardboy_du 2004-09-29
  • 打赏
  • 举报
回复
alene_cn 2004-09-29
  • 打赏
  • 举报
回复
当你看到一幅图为:

00 01 02 03 ... 0N
10 11 12 13 ... 1N
.
.
.
M0 M1 M2 M3 ... MN

它实际的存储为:

M0 M1 M2 M3 ... MN
.
.
.
10 11 12 13 ... 1N
00 01 02 03 ... 0N

8位位图用调色板存储颜色,数据区存的是调色板的索引值,所以一个像素用一个BYTE存储就够了。24位位图没有调色板,一个像素需要3个BYTE存储颜色值,顺序是BGR,不是RGB。

如果每行字节数不为4的倍数,确实需要补足,否则显示会有问题。
poor_coder 2004-09-26
  • 打赏
  • 举报
回复
顺序为从下到上 从左到右!
hardboy_du 2004-09-24
  • 打赏
  • 举报
回复
看的有点头晕
jennifergiant 2004-09-23
  • 打赏
  • 举报
回复
就是采用RLE编码压缩过的位图,分别称为RLE4和RLE8
压缩后的位图与未压缩过的存储数据不同,由三种类型的组组成:重复组、文字组和特殊组。
重复组由两个字节组成,第一个字节表示像素个数,第二个字节表示一对像素的值。文字组由一个0字节、一个像素计数字节和文字像素字节组成。像素计数值必须至少为3(小于3时,可采用重复组编码),文字像素应填充到一个偶数字节边界。特殊组中,00 00 表示一行的结束,00 01 表示位图的结束,00 02 xx yy 表示位置增量,即图像向右走xx个像素,向下走yy个像素。
hardboy_du 2004-09-23
  • 打赏
  • 举报
回复

我现在不明白的是有压缩的位图是怎么回事啊
jennifergiant 2004-09-23
  • 打赏
  • 举报
回复
像素位为4位的位图,每个字节存储两个像素,高四位对应最左边的像素
像素位为8位的位图,每个字节存储一个像素,
上述两种都是没有压缩的位图,每行填充四个字节
hardboy_du 2004-09-22
  • 打赏
  • 举报
回复
我明白了
那位大哥能把16,256的RGB的方法帖出来啊
hardboy_du 2004-09-22
  • 打赏
  • 举报
回复
to jennifergiant(希罗·尤尔) :
#define ALIGN4(i) ((i+0x3) & ~0x3)
这个我不太明白,解释一下好吗?
gloomyfish 2004-09-21
  • 打赏
  • 举报
回复

要自己补齐每行图象数据,定义为4的倍数~~~
利用一定义宏来做就行了,有很多这样一来的例子的~~
jennifergiant 2004-09-21
  • 打赏
  • 举报
回复
如果是24位的话,数据区应该是b g r
jennifergiant 2004-09-21
  • 打赏
  • 举报
回复
#define ALIGN4(i) ((i+0x3) & ~0x3)
lpdata + y * ALIGN4(linebytes)+ x * 3

不过不是r g b吧
hardboy_du 2004-09-21
  • 打赏
  • 举报
回复
对了还有一个问题
BMP的数据部分是从左下角开始的还是…………
hardboy_du 2004-09-21
  • 打赏
  • 举报
回复
unsigned char *lpdata;
lpdata = (unsigned char *)GlobalLock(hImgData);
r = *(lpdata + y * linebytes + x * 3);
g = *(lpdata + y * linebytes + x * 3 + 1);
b = *(lpdata + y * linebytes + x * 3 + 2);
GlobalUnlock(hImgData);
怎么老是不对啊?
帮帮我吧
酒红绿叶 2004-09-21
  • 打赏
  • 举报
回复
对于每行需要补齐得图像来说,是有没有用得位。
lanstar200 2004-09-21
  • 打赏
  • 举报
回复
32位位圖除外
加载更多回复(2)

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧