一种JPEG图像的无损压缩与解压缩方法转让专利

申请号 : CN200810073769.0

文献号 : CN100591089C

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 王文延

申请人 : 广西师范大学

摘要 :

本发明涉及一种JPEG图像无损压缩与解压缩的方法。其中,JPEG图像无损压缩方法是先将JPEG图像文件按规整规则进行可逆变换,得到变换后的JPEG图像文件;再将变换后的JPEG图像文件用LZ77编码或其改进算法进行压缩,压缩处理结束。对JPEG图像的解压缩方法,是先用LZ77编码或其改进算法对压缩的JPEG图像文件进行解压,得到经可逆变换后的JPEG图像文件;再将可逆变换后的JPEG图像文件用规整规则进行反规整,得到原始JPEG图像文件。本发明所述JPEG图像无损压缩与解压缩的方法可以在原有压缩比的基础上再有效去除3-10%的冗余,同时不影响JPEG图像文件的压缩/解压缩效果,且易于实现。

权利要求 :

1、一种JPEG图像无损压缩的方法,其特征在于它包括下列步骤:1)将JPEG图像文件按规整规则进行可逆变换,得到变换后的JPEG 图像文件;

所述对JPEG图像文件进行可逆变换的规整规则,包括以下步骤:①以二进制方式读取JPEG图像文件,并对得到的二进制数序列进行 分组;其中,所述分组是从第一个比特位开始,按每8个比特位为一组;

②将每组二进制代码转换成无符号十进制数,并将第一组二进制代码 转换成的无符号十进制数保存于新建数组H中;所述第一个分组数据转换 成的无符号十进制数占用1个字节的空间;

③顺序建立256个数组E[i],i=0-255;

④按由小到大的顺序遍历转换成的无符号十进制数,将每个父数据后 面出现的子数据,存放在步骤③所建立的第i个数组E[i]中,其中i=父 数据;

⑤判断遍历是否结束,若是则统计完成遍历后每个数组的长度,并存 放于新建数组G中;若否则继续步骤④;其中,数组G中记录每个数组的 长度的元素占用4个字节的空间;

⑥将256个E[i]数组中的内容依次首尾相连保存于新建数组I中;

⑦将数组H、数组G和数组I中的内容依次首尾相连合并,保存于新 建数组J中,数组J即为变换后的JPEG图像文件。

2)将变换后的JPEG图像文件用LZ77编码或其改进算法进行压缩, 压缩处理结束。

2、一种JPEG图像的解压缩方法,其特征在于它包括下列步骤:1)用LZ77编码或其改进算法对压缩的JPEG图像文件进行解压,得 到经可逆变换后的JPEG图像文件;

2)将可逆变换后的JPEG图像文件用规整规则进行反规整,得到原始 JPEG图像文件;

所述对可逆变换后的JPEG图像文件用规整规则进行反规整,包括以 下步骤:①以二进制方式读取该可逆变换后的JPEG图像文件到新建数组J中, 并对数组J中的二进制数序列进行数据分组;其中,所述分组是从第一个 比特位开始,前8个比特位作为第一组,第一组之后的256个组从第9个 比特位开始以每32个比特位作为一组,除去上述比特位之后该数组中剩 下的所有二进制代码以每8个比特位作为一组;

②将每组数据转换成无符号十进制数,并读取出第一个无符号十进制 数存放于新建数组H中;读取出用于存放子数据的数组的长度元素,并将 该长度元素依次存放于新建数组G中;其中,所述第一个分组数据转换成 的无符号十进制数占用1个字节的空间;所述用于表示存放子数据的数组 的长度元素共256个,每个元素占4个字节的空间;

③顺序建立256个数组E[i],i=0-255;

④将数组J中剩余的数据,按数组G中子数据数组的长度分别依次存 放于步骤③建立的数组E[i]中;

⑤建立A数组,将H数组中数据存放于A数组第一个位置;

⑥顺序读取A数组的数据作为父数据,在256个数组群E[i]中寻找 i=父数据的数组E[i]中第一个没有已读标志的数据作为子数据,并将该子 数据存于A数组中继该父数据之后的下一个空位置,同时将对应数组E[i] 中的该子数据的标志位置为已读;

⑦扫描256个数组E[i],并检查其中所有数据的标志位是否全部为已 读,若否则继续步骤⑥;若是则停止扫描,将数组A保存为文件,该文件 即为原始JPEG图像文件。

说明书 :

(一)技术领域:

本发明涉及一种数据的压缩和解压缩方法,具体涉及一种JPEG图像 的无损压缩与解压缩方法。

(二)背景技术:

JPEG格式的图片具有图像质量高的特点,而在计算机存储及计算机 网络传输图像中广泛使用,现有的普通数码相机的照片也大都采用JPEG 格式。因JPEG图片的图像质量较高,因而其占用的空间相对也较大,以 一部800万像素的数码相机来说,其产生的JPEG图像可高达5M字节。 为了节省存储空间,并减少图像在传输过程中所耗费的时间,通常将原 JPEG图像文件进行压缩后再保存或传输。现有的压缩方法有两类,一类 为无损压缩,这种压缩方法把数据看作是信息和冗余度的结合,其工作的 机理是去除或减少数据中的冗余度,因而不会导致原数据的丢失。另一类 为有损压缩,这种压缩不但去掉或减少数据中的冗余度,而且还忽略一些 不太重要的细节,因而拥有可观的压缩比,但这种压缩方法会丢失原文件 的某些信息,导致解压后的文件和原文件存在一定的差别。现有的无论是 无损压缩还是有损压缩的压缩方法,都是将原JPEG图像文件直接进行压 缩,这样虽然可达到一定的压缩比,减少一定的存储空间和传输耗时,但 其实原JPEG图像文件中由于其排放的序列的不同而存在一定的冗余度, 这种冗余度在不对原JPEG图像文件作规整的前提下是不能去除的,如何 对原JPEG图像文件作出更有效的规整便成为提高压缩比的又一手段。

(三)发明内容:

本发明为解决上述问题而提供一种在将JPEG图像文件进行压缩前对 该文件进行有效规整,以去除原文件中本身存在的冗余的JPEG图像的无 损压缩与解压缩方法;这种方法不但可以在原有压缩比的基础上再有效去 除3-10%的冗余,同时不影响JPEG图像文件的压缩/解压缩效果,且易于 实现。

本发明JPEG图像的无损压缩与解压缩方法中,所述JPEG图像无损 压缩的方法,其步骤如下:

1)将JPEG图像文件按规整规则进行可逆变换,得到变换后的JPEG 图像文件;

2)将变换后的JPEG图像文件用LZ77编码或其改进算法进行压缩, 压缩处理结束。

上述步骤1)中对JPEG图像文件进行可逆变换的规整规则,包括以下 步骤:

①以二进制方式读取JPEG图像文件,并对得到的二进制数序列进行 分组;

所述分组是从二进制数的第一个比特位开始,一般按每8个比特位为 一组,如果不够8位的,则在不够的这组二进制数的前面补0并补够8位;

②将每组二进制代码转换成无符号十进制数,并将第一组二进制代码 转换成的无符号十进制数保存于新建数组H中;

由于第一个分组数据转换成的无符号十进制数在0-255之间,为了节 省空间,可将该无符号十进制数设定为占用1个字节的空间;

③顺序建立256个数组E[i],i=0-255;用于存放与i对应的父数据 之后的子数据;对于任意两个相邻分组而言,位于前面的分组数据设为父 数据,位于后面的分组数据设为子数据;

④按由小到大的顺序遍历转换成的无符号十进制数,将每个父数据后 面出现的子数据,存放在步骤③所建立的第i个数组E[i]中,其中i=父 数据,若不存在与i相同的父数据,则该数组E[i]为空;

⑤判断遍历是否结束,若是则统计完成遍历后每个数组的长度,并存 放于新建数组G中;若否则继续步骤④;

所述数组G中记录每个数组的长度的元素一般占用4个字节的空间;

⑥将256个E[i]数组中的内容依次首尾相连保存于新建数组I中;

⑦将数组H、数组G和数组I中的内容依次首尾相连合并,保存于新 建数组J中,数组J即为变换后的JPEG图像文件。

本发明所述的JPEG图像的解压缩方法,包括下列步骤:

1)用LZ77编码或其改进算法对压缩的JPEG图像文件进行解压,得 到可逆变换后的JPEG图像文件;

2)将经可逆变换后的JPEG图像文件用规整规则进行反规整,得到原 始JPEG图像文件。

上述步骤2)中,所述将可逆变换后的JPEG图像文件用规整规则进行 反规整,包括以下步骤:

①以二进制方式读取该可逆变换后的JPEG图像文件到新建数组J中, 并对数组J中的二进制数序列进行分组;

所述分组是从第一个比特位开始,前8个比特位作为第一组,第一组 之后的256个组从第9个比特位开始以每32个比特位作为一组,除去上 述比特位之后该数组中剩下的所有二进制代码的二进制代码以每8个比特 位作为一组;

②将每组数据转换成无符号十进制数,并读取出第一个无符号十进制 数存放于新建数组H中;读取出用于存放子数据的数组的长度元素,并将 该长度元素依次存放于新建数组G中;

上述读取的规则按压缩时存入数据所占用的空间来顺序读取,即读取 数组J中占用1个字节空间的无符号十进制数放入数组H中;读取该无符 号十进制数之后的每4个字节为一个元素的数组长度于数组G中;

③顺序建立256个数组E[i],i=0-255;用于存放与i对应的父数据 之后的子数据;

④将数组J中剩余的数据,按数组G中子数据数组的长度分别依次存 放于步骤3)建立的数组E[i]中;

⑤建立A数组,将H数组中数据存放于A数组第一个位置;

⑥顺序读取A数组的数据作为父数据,在256个数组群E[i]中寻找 i=父数据的数组E[i]中第一个没有已读标志的数据作为子数据,并将该子 数据存于A数组中继该父数据之后的下一个空位置,同时将对应数组E[i] 中的该子数据的标志位置为已读;

⑦扫描256个数组E[i],并检查其中所有数据的标志位是否全部为已 读,若否则继续步骤⑥;若是则停止扫描,将数组A保存为文件,该文件 即为原始JPEG图像文件。

本发明与现有的压缩/解压缩方法相比,在进行压缩之前首先将要压 缩的JPEG图像文件进行可逆变换,以去除原文件本身存在的冗余,再用 LZ77编码或其改进算法进行压缩,这样可在原有的压缩比的基础上再去除 3-10%的冗余,还能保证JPEG图像文件的压缩/解压缩质量,且易于实现。

(四)附图说明:

图1:对JPEG图像文件进行可逆变换处理的流程图;

图2:对解压后的JPEG图像文件进行还原处理的流程图。

附图标记:

101、图像数据以二进制方式读出,并将二进制数序列从第一个比特 位开始,按每8个比特位为一组的形式进行分组;

102、将每组二进制代码转换成无符号十进制数,并将第一组二进制 代码转换成的无符号十进制数保存于新建数组H中;

103、顺序建立256个数组E[i];

104、按由小到大的顺序遍历转换成的无符号十进制数,将每个父数 据后面出现的子数据,存放上述步骤所建立的第i个数组E[i]中,其中 i=父数据;

105、遍历结束,统计完成遍历后每个数组的长度;

106、将256个E[i]数组中的内容依次首尾相连保存于新建数组I中;

107、将数组H、数组G和数组I中的内容依次首尾相连合并,保存于 新建数组J中,数组J即为变换后的JPEG图像文件。

201、以二进制方式读取该可逆变换后的JPEG图像文件到新建数组J 中,并对数组J中的二进制数序列进行分组;

202、将每组数据转换成无符号十进制数,并读取出第一个无符号十 进制数存放于新建数组H中;读取出用于存放子数据的数组的长度元素, 并将该长度元素依次存放于新建数组G中;

203、顺序建立256个数组E[i];

204、读取数组J中剩余的数据,按数组G中子数据数组的长度分别 依次存放于步骤3)建立的数组E[i]中;

205、建立A数组,将H数组中数据存放于A数组第一个位置;

206、顺序读取A数组的数据作为父数据,在256个数组群E[i]中寻 找i=父数据的数组E[i]中第一个没有已读标志的数据作为子数据,并将 该子数据存于A数组中继该父数据之后的下一个空位置,同时将对应数组 E[i]中的该子数据的标志位置为已读;

207、扫描256个数组E[i],并检查其中所有数据的标志位是否全部 为已读,若否则继续步骤⑥;若是则停止扫描,将数组A保存为文件,该 文件即为原始JPEG图像文件。

(五)具体实施方式:

本发明所述的JPEG图像的无损压缩与解压缩方法,包括对JPEG图 像文件的压缩与解压缩,其中对JPEG图像的无损压缩方法是将JPEG图 像文件中的内容进行信号重排即可逆变换后再用LZ77或winzip、gzip、 winrar等软件进行无损压缩。图1为将JPEG图像文件进行可逆变换处理 的流程图,如图所示,对JPEG图像文件进行可逆变换,首先将JPEG图像 文件以二进制方式读出,并将二进制数序列从第一个比特位开始,按每8 个比特位为一组的形式进行分组(步骤101);然后,将每组二进制代码转 换成无符号十进制数,并将第一组二进制代码转换成的无符号十进制数保 存于新建数组H中(步骤102);该无符号十进制数设定为占用1个字节的 空间;顺序建立256个数组E[i],i=0-255(步骤103),用于存放与i 对应的父数据之后的子数据;再按由小到大的顺序遍历转换成的无符号十 进制数,将每个父数据后面出现的子数据,存放上述步骤所建立的第i个 数组E[i]中,其中i=父数据(步骤104),若不存在与i相同的父数据, 则该数组E[i]为空;判断遍历是否结束,若是则统计完成遍历后每个数组 的长度,并存放于新建数组G中;若否则继续步骤遍历(步骤105),其中 数组G中记录每个数组的长度的元素一般占用4个字节的空间;将256个 E[i]数组中的内容依次首尾相连保存于新建数组I中(步骤106);将数组 H、数组G和数组I中的内容依次首尾相连合并,保存于新建数组J中, 数组J即为变换后的JPEG图像文件(步骤107)。

对JPEG图像的解压缩方法是将压缩的JPEG图像文件用LZ77或 winzip、gzip、winrar等软件进行解压,再将解压后的文件还原成原始的 JPEG图像文件。图2为解压后的JPEG图像文件进行还原处理的流程图, 如该图所示,对解压后的JPEG图像文件进行还原处理,首先以二进制方 式读取该可逆变换后的JPEG图像文件到新建数组J中,并对数组J中的 二进制数序列进行分组(步骤201),分组方式为从第一个比特位开始,以 每8个比特位为一组;将每组数据转换成无符号十进制数,并读取出第一 个无符号十进制数存放于新建数组H中;读取出用于存放子数据的数组的 长度元素,并将该长度元素依次存放于新建数组G中(步骤202),其读取 的规则按压缩时存入数据所占用的空间来顺序读取,即读取数组J中占用 1个字节空间的无符号十进制数放入数组H中;读取该无符号十进制数之 后的每4个字节为一个元素的数组长度于数组G中;顺序建立256个数组 E[i],i=0-255(步骤203);读取数组J中剩余的数据,按数组G中子数 据数组的长度分别依次存放于步骤3)建立的数组E[i]中(步骤204);建 立A数组,将H数组中数据存放于A数组第一个位置(步骤205);顺序读 取A数组的数据作为父数据,在256个数组群E[i]中寻找i=父数据的数 组E[i]中第一个没有已读标志的数据作为子数据,并将该子数据存于A 数组中继该父数据之后的下一个空位置,同时将对应数组E[i]中的该子数 据的标志位置为已读(步骤206),当某一父数据i的数组E[i]长度大于1 时,顺序读取该数组E[i]中的标志位未置为已读的数据;扫描256个数组 E[i],并检查其中所有数据的标志位是否全部为已读,若否则继续步骤⑥ (步骤207);若是则停止扫描,将数组A保存为文件,该文件即为原始 JPEG图像文件(步骤208)。

下面下以实例对本发明进行说明。

假设某JPEG图像文件A,

一、上述A文件的无损压缩过程如下:

以二进制方式读取出以下代码:A文件=

{0110101000101110110110110010110011001111100000010010111010 000001}

将上述二进制代码进行分组并转换成无符号十进制数为:

A文件=106 46 219 44 207 129 46 129

将106存放于新建数组H中,H={106},该数据占一个字节空间; 建立256个数组E[i],i=0-255;E[0]={}、E[1]={}、...、E[254] ={}、E[255]={};

按由小到大的顺序遍历上述无符号十进制数,并将其后出现的子数据 存放于与该子数据对应的父数据的数组中,

E[0]={};

E[1]={};

E[44]={207};

E[46]={219 129};

E [106]={46};

E[129]={46};

E[207]={129};

E[219]={44};

E[254]={};

E[255]={}。

遍历结束,统计每个数组的长度,即E[0]为0,E[1]为0、…、E[44] 为1、…、E[46]为2、…、E[106]为1、…、E[129]为1、…、E[207]为 1、…、E[219]为1、…、E[254]为0、E[255]为0,并将这些表示长度的 元素以每个元素占用4个字节空间的大小存入新建数组G中,即G=

{0,0,…,1,…,2,…,1,…,1,…,1,…,1,…,0,0};

按i从小到大的顺序,将256个E[i]数组中的内容依次首尾相连保存 于新建数组I中,即I={207,219,129,46,46,129,44};

将数组H、数组G和数组I中的内容依次首尾相连合并,保存于新建 数组J中,数组J={106,0,0,…,1,…,2,…,1,…,1,…,1,…, 1,…,0,0,207,219,129,46,46,129,44},将该数组保存为文件, 即完成对JPEG图像文件的可逆变换;

再将上述经可逆变换的文件用LZ77编码或winzip、gzip、winrar等 软件进行压缩,压缩处理结束。

二、压缩后的A文件的解压过程:

首先用用LZ77编码或winzip、gzip、winrar等软件对压缩的JPEG 图像文件进行解压,得到可逆变换后的JPEG图像文件;

以二进制方式读取上述可逆变换后的JPEG图像文件到新建数组J中, 数组 J={011010100000000000000000000000000000000000000000000000000000 000000000000…00000000000000000000000000000001…000000000000000 00000000000000010…00000000000000000000000000000001…0000000000 0000000000000000000001…00000000000000000000000000000001…00000 000000000000000000000000001…0000000000000000000000000000000000 000000000000000000000000000000110011111000000100101110001011101 000000100101100},并从第一个比特位开始,将前8个比特位作为一组, 将该组数据转换成无符号十进制数存放于新建数组H中,数据H={106};

从第9个比特位开始,以每4个字节为一个元素的数组长度,转换成 无符号十进制数后存放于新建数组G中,共读取256个数据长度元素,数 组G={0,0,…,1,…,2,…,1,…,1,…,1,…,1,…,0,0};

顺序建立256个数组E[i],i=0-255,E[0]={}、E[1]={}、…、 E[254]={}、E[255]={};

读取数组J中剩余的数据,以每8个比特位作为一组并转换成无符号 十进制数,按数组G中子数据数组的长度分别依次存放于上述步骤建立的 数组E[i]中,即

E[0]={};

E[1]={};

E[44]={207};

E[46]={219 129};

E[106]={46};

E[129]={46};

E[207]={129};

E[219]={44};

E[254]={};

E[255]={}。;

建立A数组,将H数组中数据存放于A数组第一个位置,即A={106};

顺序读取A数组的数据作为父数据,在256个数组群E[i]中寻找i= 父数据的数组E[i]中第一个没有已读标志的数据作为子数据,并将该子数 据存于A数组中继该父数据之后的下一个空位置,同时将对应数组E[i] 中的该子数据的标志位置为已读,如当父数据为106时,寻找106之后的 子数据放于数据A中106之后的位置,即A={106,46},并将该46子数据 的标志位置为已读;再寻找46之后的子数据放于数据A中46之后的位置, 即A={106,46,219},并将该219子数据的标志位置为已读;再寻找219 之后的子数据放于数据A中219之后的位置,即A={106,46,219,44}, 并将该44子数据的标志位置为已读;如此类推,直至数组E[i]中的所有 数据的标志位均为已读,此时,数组A={106,46,219,44,207,129, 46,129};

将数组A保存为文件,该文件即为原始JPEG图像文件,解压缩过程 完成。