设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
楼主: 一箭烂YiJL
打印 上一主题 下一主题

[通用发布] Bitmap 类储存为 .bmp 档案(高速= =)

[复制链接]

Lv4.逐梦者

弓箭手?剑兰

梦石
0
星屑
5529
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
11
 楼主| 发表于 2011-5-30 18:27:57 | 只看该作者
苏小脉 发表于 2011-5-30 02:25
先声明一点,“引用”的概念是计算机科学中的一个通用概念,并非面向对象的语言的专利。只不过当我们在 ...
“引用”

我想 Bitmap 指针可能的其中一个原因是 Bitmap#get_pixel、set_pixel、blur......
就可以引用位图的("同一个")颜色值数据作修改、读取......

如果让 B#a 和 B#b 都变为指针,sizeof (A) 就可以是 8 字节

"sizeof (B) 就可以是 8 字节"?

而 `b.a = a;' 也仅仅是 8 个字节的拷贝而已。

8 个字节?不解...

我这里测试是不同的,不知道你那边是如何测试的。

抱歉...我傻呆呆的用了 Bitmap.new(1, 1) 来测试~

http://msdn.microsoft.com/en-us/library/dd183376(v=vs.85).aspx

然全不知道 MSDN 有记载 Bmp 格式,但是没有给 压缩方式的域 的值(数字)讲解,
但是我记得顺序是 0~5 。我之前想压缩的时候用 png 的压缩法(Zlib 的那个),
将 biSizeImage 设置为压缩后的字节的 size。(可能是测试出错或是方法错误什么的),
出来的 bmp 说是损坏档案......
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
12
发表于 2011-5-31 08:34:41 | 只看该作者
一箭烂YiJL 发表于 2011-5-30 18:27
我想 Bitmap 指针可能的其中一个原因是 Bitmap#get_pixel、set_pixel、blur......
就可以引用位图的("同 ...

什么 Bitmap 指针?

"sizeof (B) 就可以是 8 字节"?

是的,我前一帖有 typo。

8 个字节?不解...

typo,32 位取址模型下应该是 4 个字节。在 64 位取址模型下自然就是 8 个字节了。

“而 `b.a = a;' 也仅仅是 8 个字节的拷贝而已。”

这句话应该改为:

“而 `b.a = &a;' 也仅仅是 4 个字节的拷贝而已。”

然全不知道 MSDN 有记载 Bmp 格式,但是没有给 压缩方式的域 的值(数字)讲解,
但是我记得顺序是 0~5 。我之前想压缩的时候用 png 的压缩法(Zlib 的那个),
将 biSizeImage 设置为压缩后的字节的 size。(可能是测试出错或是方法错误什么的),
出来的 bmp 说是损坏档案......

微软的文档做得还是比较彻底的,微软自己的格式当然要有文档。

又不是想用什么方法压缩就用什么方法压缩,得看 BMP 的标准。你编码端用 Zlib 压缩,人家解码端是根据标准来的,自然不会尝试去用 Zlib 解码。根据微软的文档,NT 之后似乎只有 RLE 压缩,霍夫曼的都是遗留系统(OS/2)的标准了。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv4.逐梦者

弓箭手?剑兰

梦石
0
星屑
5529
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
13
 楼主| 发表于 2011-5-31 16:51:18 | 只看该作者
苏小脉 发表于 2011-5-31 08:34
什么 Bitmap 指针?
什么 Bitmap 指针?

我有语法问题,应该是Bitmap 的那些结构体用指针指来指去。

又不是想用什么方法压缩就用什么方法压缩

我用的是 Zlib 的 DEFLATE (LZ77 + 霍夫曼) 算法,这样能够在 png 里解读。(研究 PNG 的时候发现 Zlib 还有 CRC 校验的算法)
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
14
发表于 2011-5-31 20:00:25 | 只看该作者
一箭烂YiJL 发表于  
我有语法问题,应该是Bitmap 的那些结构体用指针指来指去。
可能的其中一个原因是 Bitmap#get_pixel、set_pixel、blur......
就可以引用位图的("同一个")颜色值数据作修改、读取......

那这是什么意思呢?

我用的是 Zlib 的 DEFLATE (LZ77 + 霍夫曼) 算法,这样能够在 png 里解读。(研究 PNG 的时候发现 Zlib 还有 CRC 校验的算法)

PNG 是另一种格式,标准自然不同。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv4.逐梦者

弓箭手?剑兰

梦石
0
星屑
5529
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
15
 楼主| 发表于 2011-5-31 20:14:32 | 只看该作者
苏小脉 发表于 2011-5-31 20:00
那这是什么意思呢?
那这是什么意思呢?

于是我想说...算了...其实我那句也应该是错的...

PNG 是另一种格式,标准自然不同。

微软那里说 BMP 可以用 PNG 的压缩法,PNG 的压缩法就是 DEFLATE ( / Gzip)....
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
16
发表于 2011-6-1 08:16:03 | 只看该作者
一箭烂YiJL 发表于  
于是我想说...算了...其实我那句也应该是错的...

微软哪里说的?我查阅的材料都只提到了 RLE,霍夫曼都仅仅是存在于 OS/2 的 BMP 标准中。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv4.逐梦者

弓箭手?剑兰

梦石
0
星屑
5529
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
17
 楼主| 发表于 2011-6-2 21:40:33 | 只看该作者
苏小脉 发表于 2011-6-1 08:16
微软哪里说的?我查阅的材料都只提到了 RLE,霍夫曼都仅仅是存在于 OS/2 的 BMP 标准中。 ...

应该是我误会了吧~
MSDN 指出 BitmapInfoHeader 的第六个域(压缩方式)可以为 BI_PNG ,描述的译文:
表示这是一幅 PNG 图像。

于是我就用了 PNG 的压缩方式,可能是我误会其中的意思吧~
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
18
发表于 2011-6-3 10:52:58 | 只看该作者
一箭烂YiJL 发表于 2011-6-2 21:40
应该是我误会了吧~
MSDN 指出 BitmapInfoHeader 的第六个域(压缩方式)可以为 BI_PNG ,描述的译文:

这两个域是用在打印机硬件加速时的。

http://msdn.microsoft.com/en-us/library/dd145023(VS.85).aspx

可以把 PNG 或 JPEG 和头一起直接传给硬件支持 JPEG 和 PNG 的打印机,硬件渲染。

These compression values are only valid for SetDIBitsToDevice and StretchDIBits when the hdc parameter specifies a printer device.

翻译成汉文:
这些压缩值仅对指定了 hDC 参数为打印机设备的 SetDIBitsToDevice 和 StretchDIBits 有效。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv4.逐梦者

弓箭手?剑兰

梦石
0
星屑
5529
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
19
 楼主| 发表于 2011-6-4 15:17:02 | 只看该作者
苏小脉 发表于 2011-6-3 10:52
这两个域是用在打印机硬件加速时的。

http://msdn.microsoft.com/en-us/library/dd145023(VS.85).aspx

果然是我误会了 orz ,但是这两个域为什么叫压缩方式呢?
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
20
发表于 2011-6-5 00:18:01 | 只看该作者
一箭烂YiJL 发表于  
果然是我误会了 orz ,但是这两个域为什么叫压缩方式呢?

JPG 和 PNG 都是压缩格式,在这个域指定 JPG 或者 PNG 就告诉了打印机,接下来的数据不是 BMP,而是 JPG 或 PNG。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-24 00:49

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表