没有合适的资源?快使用搜索试试~ 我知道了~
首页图像压缩与解压缩算法解析
问题:将一张bmp图像的灰度值压缩存储到一个中间文件,然后利用中间文件还原这张图片。 BMP文件被分成4个部分:位图文件头(Bitmap File Header)、位图信息(BitmapInfoHeader)、颜色表(Color Map)和位图数据(即图像数据,Data Bits或Data Body) 第1部分为位图文件头BITMAPFILEHEADER,是一个结构体类型,该结构的长度是固定的,为14个字节。其定义如下:typedef struct tagBITMAPFILEHEADER{ WORD bfType; 位图文件类型,必须是0x424D,即字符串“BM” DWORD bfSize; 位图文件大小,包括这14个字节....此篇文章详细的介绍了图像解压缩与压缩算法,附有源代码且带有注释,希望能够提供帮助
资源详情
资源推荐
问题:将一张 图像的灰度值压缩存储到一个中间文件,然后利用中间文件还原这张图片。
初一看,这应该是两个程序吧,一个压缩程序一个解压程序。那就先压缩好喽,恩,压缩可是要怎
么读取它的灰度值呀?文件里不会只保存它的灰度值吧,点开属性,发现这是一张 的图片,如
果图片文件里只有灰度值,那么大小应该是 ,而实际大小是 字节。。可见还有其它信
息,根据经验,应该还有一个对图像的描述信息吧,这样那些图像显示程序才能知道以怎样的方式去显示
它,毕竟不是所有的 图片都是灰度图片。额,只好求助百度了经过整理,我把 图像
编码格式发到下面。
文 件 被 分 成 个 部 分 : 位 图 文 件 头 ( ) 、 位 图 信 息
()、 颜色 表()和 位图 数据 (即图 像数据 , ! 或
")
第 部分为位图文件头 BITMAPFILEHEADER,是一个结构体类型,该结构的长度是固定的,为
个字节。其定义如下:
"!#$%&'())' )*
+
,-* &".位图文件类型,必须是 / ,即字符串“0
,-* 12.位图文件大小,包括这 个字节。
,-* *!3.,4! 保留字,暂不用。
,-* *!3.,4! 保留字,暂不用。
,-* -5!.从文件头到实际的位图数据的偏移字节数
6&'())' )*7'*(&'())' )*7&'())' )*.
第 部分为位图信息头 BITMAPINFOHEADER,也是一个结构体类型的数据结构,该结构的长度也是
固定的,为 个字节(,-* 为无符号 位整数, ,-* 为无符号 位整数,(-89 为 位整
数)。其定义如下:
"!#$%&'8-)' )*
+
,-* 12.本结构的长度,为 个字节。
(-89,:.位图的宽度,以像素为单位。
(-89%:.位图的高度,以像素为单位
,-* !.目标设备的级别,必须是 。
,-* #每个像素所占的位数(),其值必须为 (黑白图像)、( 色
图);( 色)、(真彩色图),新的 格式支持 位色。
,-* !!. 位 图 压 缩 类 型 , 有 效 的 值 为 <*9 ( 未 经 压 缩 )、
<*();、<*()、 <&() 1(均为 ,4! 定义常量)。这里只
讨论未经压缩的情况, 即 !!=<*9。
,-* 12%.实际的位图数据占用的字节数
(-89>!.指定目标设备的水平分辨率,单位是像素?米。
(-89@!.指定目标设备的垂直分辨率,单位是像素?米。
,-* A!.位图实际用到的颜色数,如果该值为零则用到的颜色数为 的 # 次
幂。
,-* .位图显示过程中重要的颜色数,如果该值为零则认为所有的颜色都是重要
的
6&'8-)' )*7'*(&'8-)' )*7&'8-)' )*.
第 部分为颜色表。颜色表实际上是一个 RGBQUAD 结构的数组,数组的长度由 A! 指定(如
果该值为零,则由 # 指定,即 的 # 次幂个元素)。*9BA' 结构是一个结构体
类型,占 个字节,其定义如下:
"!#$%*9BA'
+
@&)%#.该颜色的蓝色分量;
@&)%9.该颜色的绿色分量;
@&)%*.该颜色的红色分量;
@&)%*!3.保留字节,暂不用。
6*9BA' .
有 些 位 图 需 要 颜 色 表 ; 有 些 位 图 ( 如 真 彩 色 图 ) 则 不 需 要 颜 色 表 , 颜 色 表 的 长 度 由
&'8-)' )* 结构中 # 分量决定。对于 # 值为 的二值图像,每像素占
,图像中只有两种(如黑白)颜色,颜色表也就有 C= 个表项,整个颜色表的大小为 ; 个字节;
对于 # 值为 ; 的灰度图像,每像素占 ;,图像中有 C;= 种颜色,颜色表也就有
个表项,且每个表项的 *、9、 分量相等,整个颜色表的大小为 个字节;而对于 #=
的真彩色图像,由于每像素 个字节中分别代表了 *、9、 三分量的值,此时不需要颜色表,因此真彩
色图的 &'8-)' )* 结构后面直接就是位图数据。
第 部分是位图数据,即图像数据,其紧跟在位图文件头、位图信息头和颜色表(如果有颜色表的话)之
后,记录了图像的每一个像素值。对于有颜色表的位图,位图数据就是该像素颜色在调色板中的索引值;
对于真彩色图,位图数据就是实际的 *、9、 值(三个分量的存储顺序是 、9、*)。下面分别就
色、 色、 色和真彩色位图的位图数据进行说明:
D对于 色位图,用 位就可以表示该像素的颜色,所以 个字节能存储 ; 个像素的颜色值。
D对于 色位图,用 位可以表示一个像素的颜色。所以一个字节可以存储 个像素的颜色值。
D对于 色位图, 个字节刚好存储 个像素的颜色值。
D对于真彩色位图, 个字节才能表示 个像素的颜色值。
需要注意两点:
第一,,4! 规定一个扫描行所占的字节数必须是 的倍数,不足 的倍数则要对其进行扩充。假设
图像的宽为 ,: 个像素、每像素 # 个比特,其一个扫描行所占的真实字节数的计算公式如
下:
12(=E,:#?;FG?
那么,不压缩情况下位图数据的大小(&'8-)' )* 结构中的 12% 成员)计算如下:
12%= 12(%:
第二,一般来说, 文件的数据是从图像的左下角开始逐行扫描图像的,即从下到上、从左到右,将
图像的像素值一一记录下来,因此图像坐标零点在图像左下角。
好了,有了以上的知识后,可以开始压缩程序啦H恩,现在问题是怎么读取那两个结构体,大家都知
道 $ 语言的文件读取有两种方式,一个是按字节读取,一个是按位读取,那么用哪个呢?只好又百度
了好了,百度好了:
二进制方式很简单,读文件时,会原封不动的读出文件的全部內容,写的時候,也是把內存缓冲区的內容
原封不动的写到文件中。
而文本方式就不一样了,在读文件时,会将换行符号 *(E/ /'G全部转换成单个的 /',并且
当遇到结束符 &*(IE/'G时,就认为文件已经结束。相应的,写文件时,会将所有的 /' 换成
/ /'。 所以,若使用文本方式打开二进制文件时,就很容易出现文件读不完整,或內容不对的错
误。即使是用文本方式打开文本文件,也要谨慎使用,比如复制文件,就不应该使用文本方式。(更多类
容请自己百度)
这里我们选择二进制的读入方式
EJ:7!2E&'())' )*G77G.
以上以读取头部为例,其它的类似(注意要按顺序读取,不要弄反了)
好了,到此第一步已经完成了我们把灰度信息读取到了一个数组里,那开始压缩了,这个按书上那个程序
就好,压完得到一个 KL,KL7分别记录每一段的长度和那一段每个像素需要的位数,特别提醒,书上的程
序有一个 #%!!
原文 ## 函数里有一段是这样的:
EM=.MN=.MFFG+KML=K!KMLL.KML=K!KMLL.6
应该是
forEM=.MN=.MFFG+
KML=K!KMLL.
/=O.
forE=!KMOLF.N=!KML.FFG+??特别注意这个地方书上错了
ifEEKLGP/G??KL应该取第 M 段中占用位数最大的那个
/=EKLG.
6
KML=/.
6
KML不应该简单的赋值为 K!KMLL.而是应该取第 M 段中占用位数最大的那个。(太相信课本了,以至于开始
的时候没仔细看它,浪费了好几个小时╮EQRSGT)另外要注意书上那个程序灰度值数组下标是从 开始
的,这点要注意下(这个地方也死了 个多小时╮EQRSGT)好了现在我们得到两个数组 KL和 KL7分别记
录每一段的长度和那一段每个像素需要的位数,
好了开始将数据压缩到文件里吧,恩怎么压呢?当然是一段一段压啦,首先放入第一段的长度(; 位)然
后是每个像素所占的位数( 位)然后循环一下把这个段压下去,这些都不是 ; 的倍数该怎么压呀……猛
一想确实挺头疼的。仔细想想我们只要用一个变量 M 指示当前字节下标(也就是你要压缩到的那个数组),
然后一个变量 指示当前字节还剩多少位可用
这样比如说将一个占 位的数据压入的代码是
ifEN=G+
剩余12页未读,继续阅读
vane89
- 粉丝: 3
- 资源: 19
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- 保险服务门店新年工作计划PPT.pptx
- 车辆安全工作计划PPT.pptx
- ipqc工作总结PPT.pptx
- 车间员工上半年工作总结PPT.pptx
- 保险公司员工的工作总结PPT.pptx
- 报价工作总结PPT.pptx
- 冲压车间实习工作总结PPT.pptx
- ktv周工作总结PPT.pptx
- 保育院总务工作计划PPT.pptx
- xx年度现代教育技术工作总结PPT.pptx
- 出纳的年终总结PPT.pptx
- 贝贝班班级工作计划PPT.pptx
- 变电值班员技术个人工作总结PPT.pptx
- 大学生读书活动策划书PPT.pptx
- 财务出纳月工作总结PPT.pptx
- 大学生“三支一扶”服务期满工作总结(2)PPT.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功