⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

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

📁 About transforms DCT using the separate cosine jpeg the compression the matlab source program, simpl
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0067)file://C:\WINDOWS\Desktop\进制转换\用VB语言编程实现JPEG数据压缩.htm --><!-- saved from url=(0047)http://www.phenixsun.com/files/jgjs/file1/2.htm --><HTML><HEAD><TITLE>用VB语言编程实现JPEG数据压缩</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<STYLE type=text/css>A:link {
	COLOR: blue; TEXT-DECORATION: none
}
A:visited {
	COLOR: blue; TEXT-DECORATION: none
}
A:hover {
	COLOR: red; TEXT-DECORATION: underline
}
</STYLE>

<META content="MSHTML 6.00.2800.1400" name=GENERATOR></HEAD>
<BODY bgColor=#f0f0f0>
<P>
<P align=center><NOBR><FONT face=楷体_GB2312 color=red 
size=6><B>用VB语言编程实现JPEG数据压缩</B></FONT></NOBR></P>
<P align=center><NOBR><FONT face=楷体_GB2312 color=#454545 
size=5>周俊敏</FONT></NOBR></P>
<TABLE align=center border=0>
  <TBODY>
  <TR>
    <TD><PRE><FONT color=green size=4>

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

<STRONG>    一、颜色转换及采样</STRONG>

    1.颜色转换:对BMP图像中的颜色数据进行由RGB一YCbCr的转换,Y表示亮度,
CbCr分别表示蓝色度和红色度。 
    转换公式:
    Y=0.2990R+0.5870G+0.1140B
    Cb=-0.1687R-0.3313G+0.5000B
    Cr=0.5000R-0.4187G-0.0813B
    这样转换以后就得到三个新的基色值,对这三个基色值来讲,都可以当作一
个独立的图像平面来进行压缩编码。
    2.采样:颜色转换后,保留每一点的亮度值Y而色度值Cb,Cr则是每两点保
留一点,在图像的行和列方向上都可执行颜色采样,这里采用的采样比是行列方
向都是2:1:1,在行方向,每两点保留一点,列方向也是每两点保留一点,这样如
果假设原来的CbCr矩阵大小为M*S,则经过2:1:1抽样之后成了M/2*s/2=1/4M*S,
只有原来的1/4了,图像大大缩小,如果想减小图像的失真度,则可行方向不抽样
或列方向不抽样。
    程序实现:
    1.读取BMP图像信息,获取图像行像素和列像素数值,在BMP图像中,图像数
据是以倒序存放的。亦即实际图像第一行数据存放在BMP图像数据矩阵的最后一行,
依次类推,所以取数据的时候要从BMP图像数据矩阵的最后一行开始读起,把数据
存放在新建数组(或称矩阵)的第一行,一直取完。BMP图像行像素和列像素的数值
分别存于文件头信息的第18和22字节。用Get语句可得到Pwidth(图像宽度)和Phight
(图像高度)的数值。
    2.得到Pwidth*Phight后便得知BMP图像的像素点大小,而数据矩阵(三基色,
RGB矩阵)的大小是Pwidth*Phight*3,因为每一个像素点都含有RGB三个数据,我
们要处理的是数据矩阵而不是像素点矩阵。所以,新建数组的大小是(Pwidth*3)*
Phight。
    在BMP图像数据矩阵中,三原色RGB的排列顺序是这样的:

             B. G. R. B. G. R...........R
             B. G. R....................R
             B........
             .                          .
             .                          .
             .                          .
             .                          .
             .                          .
             .                          .
             B. G. R....................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.114B(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)
    (For n=1 To PW*PH)
    其中PW为Pwidth的简写,PH为Phight的简写。
    得Y、Cb、Cr矩阵后,先判断一下三个矩阵的行数和列数是否都被16整除,
如果不能则以最后一行或一列的数据填充到能被16整除为止,所需填充的数目
为:
    行方向:16-(Pwidth mod 16)
    列方向:16-(Phight mod 16)
    填充以后YCbCr矩阵的大小成为M*S,其中,设M=Pwidth+16-(Pwidth mod 
16);S=Phight+16-(Phight mod 16)。
    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,至此已经完成了颜色转
换及采样,接下来做第二步——DCT变换。

<STRONG>    二、DCT变换</STRONG>

    在DCT变换之前得做一些准备工作,由于DCT变换一次只能做64个数据。因
此,首先得把Y、Cb、Cr矩阵分成一个8*8的小块;其次,由于离散余弦变换公
式所能接受的数值范围是-128至127之间,因此还得把Y、Cb、Cr矩阵中的每个
数据减去128。
    分块是一项比较烦琐的工作,尤其是对于Y矩阵,Cb、Cr矩阵好办,直接
按顺序分成8*8块就可以了,而Y块为了保证4个8*8Y块对应一个8*8Cb块和一个
8*8Cr块,不致打乱顺序,得先把Y矩阵分成一个个16*16的块,这样得到一个
16*16Y块对应一个8*8Cb块和一个8*8Cr块,然后再把每一个16*16块分成四个
8*8小块,图示如下:

<P align=center><IMG height=224 src="用VB语言编程实现JPEG数据压缩.files/2-0.gif" width=500></P>
    上图中每一个标有数字的小块表示一个8*8块,小块中的数字表示分块以
后,该8*8小块在矩阵中的位置顺序。
    二维DCT变换公式为:

<P align=center><IMG height=39 src="用VB语言编程实现JPEG数据压缩.files/2-1.gif" width=300></P>
    其中x,y代表图像数据矩阵中的某个数据值的坐标位置
    f(x,y)指图像数据矩阵中该点的数据值
    u,v指经过DCT变换后矩阵中的某数值点的坐标位置,在这里u=x,v=y
    F(u,v)指经过DCT变换后该坐标点的数据值。
    当u=0,v=0时,C(u)C(v)=1.414/2
    当u&gt;0,v&gt;0时,C(u)C(v)=1,经过变换后的数据值F(u,v)称为频率系数(或
称DFT系数)。
    由于VB汇编中都无法实现二维DCT计算公式,所以只有把二维的变换变
成先做一维,再做另一维的变换,一维DCT变换公式见附图一。
    在我的程序中,设一个大小为8的数组SL(8),元素计数从1开始,而不是通常
的0开始,先读取一个8*8块的第一行数据值,赋给SL(8),对SL(8)进行一维DCT变
换后得到一个新的SL(8)数组,再把SL(8)数组覆盖到原来的8*8块中相应的地方
去。做完第一行后再做第二行,一直做完8行,一个8*8块的一维DC即告完成,然
后再做列方向的第二维DCT变换,变换公式一样,只是由SL(8)取8*8块的行数据
变成取列数值。做完后覆盖回原值,即得到一个8*8块的DFT系数块,再重复这两
个过程做第二个8*8块......一直到做完全部8*8块(Y,Cb,Cr)。
    这样就得到Y、Cb、Cr的DFT系数矩阵,要做到DCT系数矩阵还得把DFT系数矩
阵以一个系数矩阵,Y矩阵用一个系数矩阵,Cb、Cr合用另一个系数矩阵,这两
个系数矩阵见附录二,这两个系数矩阵可以直接得到第三步的量化结果。

    <B>三、量化</B>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -