具体实施方式
本发明实施例提供了一种图像压缩方法及其装置,用以解决大数据量图像在压缩过程中,因需要申请较大的内存空间,并且申请内存空间失败,而导致图像压缩失败的问题,实现大数据量图像正常压缩并完整输出。
所述大数据量的图像为图像数据量超过100M的图像,在对所述大数据量的图像进行压缩的过程中,由于图像数据量太大,存在申请内存空间失败的问题。例如:若打印纸张大小为A3(297×420mm)幅面,打印分辨率为1200×1200dpi,则每页共包含278403102个像素点,每个像素点需要RGB3个字节来描述其颜色,则共需要835209306Byte的内存空间来存储一页的图像数据。若对整页图像数据进行压缩,至少需要申请835M的内存空间,几乎不可能申请成功。
假设原始图像数据大小为200M,整幅图像在压缩过程中至少还需要申请200M的内存空间来存储压缩过程中产生的图像数据,这就常常产生无法申请到内存空间而导致图像压缩程序运行失败的现象。若把原始图像分割为若干个子图像,每个子图像的数据量相对较小,逐一对每一个子图像进行压缩,在对子图像压缩的过程中,只需要申请一个较小的内存空间,该内存空间用于存储子图像压缩过程中产生的所有数据,每一个子图像都在该申请的内存空间进行压缩,当压缩完一个子图像后,将压缩后的该子图像写入一个中间文件的相应位置,在压缩过程中产生的大量的数据将会被下一个即将压缩的子图像覆盖。当一个子图像经压缩后得到与该子图像相对应的压缩子图像,将该压缩子图像存储到中间文件,然后对下一个子图像进行压缩,当所有子图像压缩完毕,并且所有压缩子图像都已写入所述中间文件后,将该中间文件中的所有压缩子图像输出。
所述200M的原始图像数据在压缩之后,其压缩图像数据不超过10M,因此,只需要一个存储空间较小的中间文件,就可以对压缩子图像进行存储,并将该中间文件中的压缩子图像输出到输出设备。这样,避免了整幅原始图像在压缩过程中申请内存空间失败的问题。而在对图像进行压缩的过程中,申请低于90M的内存空间往往不存在申请内存空间失败的问题。因此,本发明通过对原始图像进行分割,得到分割后的多个子图像,依次对每个子图像进行压缩,在压缩的过程中,只需申请一个能够正常压缩子图像的内存空间,大大减少了在对整幅图像进行压缩的过程中无法申请到内存空间的可能性。
本发明实施例通过对原始图像进行分割,依次对分割后得到的每个子图像进行压缩,得到与每个子图像相对应的压缩子图像,最后将所有压缩子图像进行拼接,将拼接后的完整的压缩图像输出到显示设备,实现了对大数据量图像进行正常压缩,避免了现有技术大数据量图像在压缩过程中申请内存空间失败,导致图像压缩失败的问题。在对每个子图像进行压缩后,通过舍弃一部分位于压缩子图像边缘的图像,仅将位于压缩子图像的内部图像输出,可以有效地避免压缩子图像拼接后出现的接缝的情况,提高压缩图像的质量。
参见图1,为本发明实施例提供的图像压缩方法,包括以下步骤:
S101、将原始图像分割成多个子图像。
S102、依次对所述子图像进行压缩,得到压缩子图像。
S103、对所述压缩子图像进行拼接,得到完整的压缩图像。
较佳地,所述原始图像经分割后得到的多个子图像为面积相等的矩形图像。所述大小相等的矩形图像,可以最大限度地利用图像在压缩过程中申请的内存空间。
所述多个子图像也可也是面积不相等的矩形图像。
所述对原始图像进行分割,必须保证每一矩形子图像的数据量不超过对该子图像进行压缩过程中申请的内存空间。
每个子图像为大小合适的矩形图像,即每个子图像的数据量不超过90M。
当子图像太大时,例如子图像的数据量超过90M时,在对该子图像进行压缩的过程中,可能还会存在申请内存失败的问题,当子图像太小时,子图像的个数反而太多,从而对原始图像的总的压缩时间太长,不利于提高对原始图像的压缩效率。
一般情况下,当图像的数据量不超过90M时,在压缩过程中不存在申请内存失败的问题。
因此,在对原始图像分割的过程中,应尽量兼顾以下两点:子图像的个数最少;每个子图像的大小不超过90M。
所以,子图像的个数由原始图像的大小决定,例如:当原始图像数据量为835M时,可将原始图像分割成10个子图像,当原始图像的数据量为300M时,可将原始图像分割成4个子图像,当原始图像的数据量为200M时,可将原始图像分割成3个子图像,等等。
为了使得本发明实施例提供的图像压缩方法更加简单,采用最简单的图像分割方式,如图2所示,将原始图像从左向右或者从上到下分割成多个矩形子图像;如图3所示的图像分割方式,图3中所示的“1”、“2”、“3”、“4”分别表示原始图像分割后得到的子图像1、子图像2、子图像3、子图像4。
分割后得到的子图像经过压缩后,得到压缩子图像,将所述压缩子图像,拼接到一起,所述拼接,即将所有压缩子图像写入中间文件,该中间文件可以是位图对象。并且将每个压缩子图像写入中间文件的相应位置,使得中间文件中各压缩子图像所处的位置和该压缩子图像在压缩前处于原始图像中的位置相同,最后将该位图对象中的所有压缩子图像输出到显示设备,输出一幅完整的压缩图像。
将原始图像分割成多个子图像;依次对所述子图像进行压缩,得到压缩子图像;对所述压缩子图像进行拼接,得到完整的压缩图像,具体如下:
设原始图像分割后得到的两个子图像:子图像1、子图像2。
1)从原始图像获取子图像1的图像数据,将该图像数据写入所申请用于压缩子图像的内存空间;对该子图像1进行压缩计算,将该压缩计算后得到的压缩子图像写入中间文件相应的位置,该中间文件可以为位图对象。
2)从原始图像获取子图像2的图像数据,将该图像数据写入所申请的用于压缩子图像的内存空间,同时覆盖在压缩子图像1的过程中产生的所有数据;对该子图像2进行压缩计算,将该压缩计算后得到的压缩子图像写入所述中间文件相应的位置。
3)最后将中间文件中的所有压缩子图像输出到显示设备,形成一幅完整的压缩图像。
按照图3所示的图像分割方式,如果简单地将压缩子图像直接按照边缘对边缘的方式拼接在一起,在拼接后的两个压缩子图像之间可能会出现一条接缝,所述接缝如图4所示。其中图4中11、12和13表示压缩子图像,阴影部分14、15表示压缩子图像11、12和13在拼接后产生的接缝。所述产生接缝的原因为:图像压缩的本质就是将原始图像中的多个像素点经过计算后变成压缩后图像中的一个像素点,压缩后的图像的内部像素点是由压缩前该像素点周围的像素点共同决定的,而压缩后的图像的边缘的点只能由压缩前图像内部的相邻的像素点共同决定。子图像边缘的像素点较少,边缘像素点压缩后形成的压缩子图像的颜色模糊,如果将压缩子图像直接边缘对边缘拼接在一起,可以明显地看到在拼接部位有一条接缝。
接缝的出现影响原始图像压缩后的图像质量,为了解决原始图像在压缩后,压缩子图像之间可能会出现接缝的问题,
较佳地,在将原始图像分割成多个子图像时,相邻的两个子图像之间具有部分重叠的区域;如图5所示,每个阴影部分为相邻两个图像的重叠的区域。所述相邻的两个子图像的重叠区域的大小与图像压缩比例有关,一般情况下,可将该重叠区域取为子图像区域的1/4,如果重叠区域太大,会增加需要压缩的图像的面积,不利于提高图像压缩效率,如果重叠区域太小,还会出现接缝的现象。
并且,逐一对每个子图像进行压缩并剪切。
所述对压缩子图像进行剪切,具体包括:剪切压缩后的相邻的子图像的重叠区域的一部分区域,得到剪切后的压缩子图像,所述重叠区域被剪切掉的区域的宽度由以下公式决定:
y=(x*f)/2,
其中,y表示需要剪切掉的区域部分的宽度,x表示相邻的两个子图像之间的重叠区域的宽度,f表示每个子图像的压缩比例。
若相邻的两个压缩子图像,图像重叠部分除剪切掉的图像外,其余图像完全一致,则可以保证拼接后没有接缝。
参见图6,本发明实施例提供的一种图像压缩装置包括:
图像分割单元21,用于对所述原始图像进行分割,将该原始图像分割成多个子图像;
图像压缩单元22,用于对所述多个子图像进行压缩,得到多个压缩子图像;
图像拼接单元23,用于对所述压缩子图像进行拼接,得到完整的压缩图像;
所述图像分割单元21,具体用于,将原始图像分割成多个面积相等的矩形子图像。
其中,每一矩形子图像的数据量不超过对该子图像进行压缩过程中申请的内存空间的大小。
所述将原始图像分割成多个大小相等的矩形图像为:将原始图像从左向右分割成多个矩形子图像或者从上到下分割成多个矩形子图像。
所述分割后得到的矩形子图像,相邻的两个矩形子图像之间具有重叠的区域。
所述图像压缩单元22,用于对所述子图像进行压缩,得到多个压缩子图像;
其中,,依次对所述子图像进行压缩;
剪切压缩后的相邻的子图像的重叠区域的一部分区域,得到剪切后的压缩子图像。
所述重叠区域被剪切掉的区域的宽度由以下公式决定:
y=(x*f)/2,
其中,y表示需要剪切掉的区域部分的宽度,x表示相邻两个子图像之间的重叠区域的宽度,f表示每个子图像的压缩比例。
本发明实施例中对子图像的压缩过程,是利用现有的压缩计算函数,例如WindowsGDI+的DrawImage函数,但是不限于使用该函数。
综上所述,通过将大数据量图像分割成多个子图像;依次对所述子图像进行压缩得到压缩子图像;将所述压缩子图像进行拼接,得到完整的压缩图像。由于每个子图像的数据量小于原始图像的数据量,相应地在对该子图像进行压缩时,需要申请的内存空间较小,申请较小的内存空间比较容易,对每个分割后得到的子图像的压缩过程都是在所述申请的内存空间进行的,解决了现有大数据量图像在压缩过程中一次性申请较大内存空间,并申请内存空间失败,导致图像压缩失败的问题。
为了有效避免压缩子图像拼接后出现接缝的情况,提高压缩图像的质量,分割后得到的矩形子图像满足:相邻的两个矩形子图像之间具有重叠区域。依次对所述矩形子图像进行压缩得到压缩子图像,其中,得到一个压缩子图像后,剪切压缩后的相邻的子图像的重叠区域的一部分区域,得到剪切后的压缩子图像。最后将所有经剪切后的压缩子图像输出到显示设备,得到完整的没有接缝的压缩图像。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。