用vb语言编程实现jpeg数据压缩

用vb语言编程实现jpeg数据压缩

ID:37088525

大小:81.51 KB

页数:9页

时间:2019-05-17

用vb语言编程实现jpeg数据压缩_第1页
用vb语言编程实现jpeg数据压缩_第2页
用vb语言编程实现jpeg数据压缩_第3页
用vb语言编程实现jpeg数据压缩_第4页
用vb语言编程实现jpeg数据压缩_第5页
资源描述:

《用vb语言编程实现jpeg数据压缩》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、用VB语言编程实现JPEG数据压缩JPEG压缩格式是目前图像处理领域里面用得最广泛的一种图像压缩方式,它的实现主要分成四个步骤:1.颜色模式转换及采样;2.DCT变换(离散余弦变换);3.量化;4.编码(有算术编码和霍夫曼编码两种,这里采用霍夫曼编码),用VB语言编程实现以上四个步骤,即完成了JPEG压缩过程,这里假设给定的源图像是一幅24位真彩色的BMP图像。一、颜色转换及采样1.颜色转换:对BMP图像中的颜色数据进行由RGB一YCbCr的转换,Y表示亮度,CbCr分别表示蓝色度和红色度。转换公式:Y=0.2

2、990R+0.5870G+0.1140BCb=-0.1687R-0.3313G+0.5000BCr=0.5000R-0.4187G-0.0813B这样转换以后就得到三个新的基色值,对这三个基色值来讲,都可以当作一个独立的图像平面来进行压缩编码。2.采样:颜色转换后,保留每一点的亮度值Y而色度值Cb,Cr则是每两点保留一点,在图像的行和列方向上都可执行颜色采样,这里采用的采样比是行列方向都是2:1:1,在行方向,每两点保留一点,列方向也是每两点保留一点,这样如果假设原来的CbCr矩阵大小为M*S,则经过2:1:1

3、抽样之后成了M/2*s/2=1/4M*S,只有原来的1/4了,图像大大缩小,如果想减小图像的失真度,则可行方向不抽样或列方向不抽样。程序实现:1.读取BMP图像信息,获取图像行像素和列像素数值,在BMP图像中,图像数据是以倒序存放的。亦即实际图像第一行数据存放在BMP图像数据矩阵的最后一行,依次类推,所以取数据的时候要从BMP图像数据矩阵的最后一行开始读起,把数据存放在新建数组(或称矩阵)的第一行,一直取完。BMP图像行像素和列像素的数值分别存于文件头信息的第18和22字节。用Get语句可得到Pwidth(图像

4、宽度)和Phight(图像高度)的数值。2.得到Pwidth*Phight后便得知BMP图像的像素点大小,而资料矩阵(三基色,RGB矩阵)的大小是Pwidth*Phight*3,因为每一个像素点都含有RGB三个数据,我们要处理的是数据矩阵而不是像素点矩阵。所以,新建数组的大小是(Pwidth*3)*Phight。在BMP图像数据矩阵中,三原色RGB的排列顺序是这样的:B.G.R.B.G.R...........RB.G.R....................RB..........B.G.R........

5、............R接下来,把这一个矩阵(包含BGR)拆分成三个独立的B、G、R矩阵,得到三个新的矩阵(只包含B的矩阵,只包含G的矩阵,只包含R的矩阵),简称为B矩阵、G矩阵、R矩阵(大小为Pwidth*Phight),用程序实现拆分,只要依次取原矩阵的第1、4、7、10、13......个数据即得到B矩阵,依次读取第2、5、8、11......个数据即得到G矩阵,依次读第3、6、9、12......个数据即得到R矩阵。得到B、G、R矩阵后再利用颜色转换公式很容易就可得到YCbCr矩阵。Y(n)=0.11

6、4B(n)+0.587G(n)+0.299R(n)Cb(n)=0.5B(n)-0.3313G(n)-0.1687R(n)Cr(n)=0.0813B(n)-0.14187G(n)+0.5R(n)(Forn=1ToPW*PH)其中PW为Pwidth的简写,PH为Phight的简写。得Y、Cb、Cr矩阵后,先判断一下三个矩阵的行数和列数是否都被16整除,如果不能则以最后一行或一列的数据填充到能被16整除为止,所需填充的数目为:行方向:16-(Pwidthmod16)列方向:16-(Phightmod16)填充以后YC

7、bCr矩阵的大小成为M*S,其中,设M=Pwidth+16-(Pwidthmod16);S=Phight+16-(Phightmod16)。3、抽样:Y矩阵不动,CbCr矩阵行列方向上相邻两点只保留一点的数据值(只要在其行方向取第1、3、5、7......个数值,列方向也取1、3、5、7......个数据即可完成2:1:1采样),行、列方向都进行2:1:1抽样后的Cb、Cr矩阵大小变成原来的1/4(M/2*S/2)。现在的结果是Y矩阵大小为M*S,Cb,Cr为M/2*S/2,至此已经完成了颜色转换及采样,接下来

8、做第二步——DCT变换。二、DCT变换在DCT变换之前得做一些准备工作,由于DCT变换一次只能做64个数据。因此,首先得把Y、Cb、Cr矩阵分成一个8*8的小块;其次,由于离散余弦变换公式所能接受的数值范围是-128至127之间,因此还得把Y、Cb、Cr矩阵中的每个资料减去128。分块是一项比较烦琐的工作,尤其是对于Y矩阵,Cb、Cr矩阵好办,直接按顺序分成8*8块就可以了,而Y块为了

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。