一种3D打印文件的压缩方法
技术领域
本发明属于数据处理领域,具体涉及一种3D打印文件的压缩方法。
背景技术
在3D光固化打印机中,打印文件是由一张张3D模型切片图和一部分参数组合而成的一种记录性文件。打印文件主要记录3D模型切片后的大量的层图像数据,对复杂度高和体积较大的模型来说,由于信息量巨大,往往导致该类型的记录性文件过大。比如目前常见格式的打印文件,svg文件或者简单打包文件等,一个打印文件就超过2GB。
在3D光固化打印机的软件控制系统中,往往由于硬件成本、嵌入式软件架构等导致可用的运行内存相对十分有限,而目前常见的压缩位图(如png)和矢量图(如svg)加载都需要先开辟同图像大小的内存,一次完整加载图像后,才能一并传递给“显存”。目前常见的4KLCD打印机需要开辟8MB,6K打印需要开辟20MB内存。为了加快效率或者支持其他功能等,需要额外开辟同大小内存,而部分运行内存只有128MB。以上方式很容易导致运行内存占用过高,从而导致系统不稳定。因此,需要一种3D打印文件的压缩方法,降低3D模型切片图的内存。
发明内容
本发明的目的在于针对光固化打印机中,打印文件过大问题和内存中层图像大小占用过大,提出一种3D打印文件的压缩方法,通过无效数据过滤、相邻层图像数据做差和分类编码的方式解决打印文件过大问题。
一种3D打印文件的压缩方法,包括如下步骤:
步骤(1)过滤数据:遍历所有层的图像数据,将像素值小于设定值的数据设置为0,保存新的图像数据。
图片的背景通常为像素值较小的数据,这些数据可以统一设置为0便于后期数据的分类。
步骤(2)获取差异图并标记每一层:遍历所有层的图像数据,获取当前层与上一层的像素值的差异图,判断并标记每一层为差异层、非差异层或者基准层。
3D模型切片后可能会有一些切片图片相同,例如圆柱模型的每一个切片图都相同,因此这些相同的切片图层被标记为非差异层,若该层与上一层有差异,则标记为差异层。连续相同的非差异层中,第一个出现的非差异层标记为基准层。
步骤(3)数据分类:根据像素值将所有数据分为三类:有效数据、灰度数据和无效数据。
在3D光固化打印中,有效数据是光强值最大的部分,无效数据是光强值为0的部分,灰度数据是其余的部分,光强值越大,光固化树脂固化越快。
步骤(4)根据当前层类型和数据类型编码:当前层若是基准层,则将该层的所有数据根据有效数据、灰度数据和无效数据进行分类编码;当前若是差异层,则将该层的差异图根据有效数据、灰度数据和无效数据进行分类编码;当前层若是非差异层,则记录其层数。
非差异层不需要每一层都编码,只要记录基准层的所有数据和该基准层的连续非差异层的层数即可。对于差异层,只需将该差异层的差异图进行编码,无需将该差异层所有的图像数据进行编码。读取的时候将差异图叠加到上一层的图像数据上,即可生成该差异层的图像数据。有效数据和无效数据的像素值都是固定的,而且通常为连续的,因此只需要记录其长度,无需记录每个数据的像素值。灰度数据的数值不同,每个灰度数据都要进行编码。该步骤通过非差异层记录层数、差异层的差异图编码、数据分类编码三个方法有效压缩3D打印图片的储存大小。
步骤(5)重复步骤(4)直至所有层已编码或者已记录层数。
优选的,步骤(1)中,设定值的范围为10-100。设定值越高,过滤数据越多,降低打印精度;设定值越低,过滤数据越少,压缩效果越差,因此需要根据3D模型的实际情况对设定值进行选择。
优选的,步骤(2)中,若当前层与上一层像素值没有区别,则标记当前层非差异层,连续相同的非差异层中,第一个出现的非差异层标记为基准层;若当前层与上一层像素值有区别,则标记当前层为差异层。通过区别差异层、非差异层和基准层,便于后期压缩非差异层和差异层。
优选的,步骤(2)中,生成差异图时,设△diffPix=当前层像素值-上一层像素值,若△diffPix≥0,直接保存△diffPix;若△diffPix<0,保存255+△diffPix。
优选的,步骤(3)中,有效数据为像素值=255,灰度数据为0<像素值<255,无效数据为像素值=0。有效数据为模型主体部分,灰度数据为模型轮廓,无效数据为背景。
优选的,步骤(4)中,具体编码步骤如下:
步骤a.遍历该层每一行内的每一个数据;
步骤b.找到当前行下一连续段第一个非无效数据位置;该步骤找到3D模型的边缘;
步骤c.把当前累计的连续的无效数据进行编码写入无效数据队列;该步骤将3D模型边缘之前的无效数据(即背景)编写进无效数据队列;
步骤d.把当前非无效数据放入非无效数据队列;该步骤把3D模型的数据放入非无效数据队列;
步骤e.遍历索引值加一后,重复步骤d,直到找到第一个无效数据位置;该步骤找到3D模型另一个边缘;
步骤f.将非无效数据队列中的有效数据和灰度数据分别进行编码;该步骤将灰度数据进行编码,有效数据可根据其连续长度进行压缩;
步骤g.无效数据长度累加1;
步骤h.重复步骤b-g,直至当前行最后一个像素值;
步骤i.遍历下一行,重复步骤a-h,直至遍历该层所有行。
优选的,步骤(4)中的步骤f中,具体步骤如下:对非无效数据队列统计连续相同值长度得到连续相同值长度数组I,遍历连续相同值长度数组I,提取连续相同值大于2的值,对连续相同值大于2的值前后的连续相同值小于等于2的值分别做加法,得到连续相同值长度数组II,连续相同值长度数组II描述了非无效数据队列中连续相同值长度大于2的分布情况;遍历连续相同值长度数组II,对其中长度大于1的有效数据进行有效数据编码,对其余部分进行灰度数据编码。
优选的,编码过程中,若超过数据编码最大长度,对数据进行分段同方式编码。
由于采用上述技术方案,本发明具有以下有益效果:
本发明通过无效数据过滤、相邻层图像数据做差和分类编码的方式解决打印文件过大问题,能有效压缩3D打印图片的储存大小。具体有益效果如下:
1、3D打印图片背景,即无效数据,若每个都编码,则会占用了许多内存,因此过滤这些无效数据,使其像素值均为0,便于后期数据分类,同样也便于无效数据的编码。
2、分辨出差异层、非差异层基准层之后,非差异层不需要每一层都编码,只要记录基准层的所有数据和该基准层的连续非差异层的层数即可,差异层只需将该差异层的差异图进行编码,无需将该差异层所有的图像数据进行编码,从而压缩3D打印图片的储存大小。
3、有效数据和无效数据因为数值固定,而且通常为连续的,因此将有效数据和无效数据提取出来,分别记录其连续的长度,无需每个数据进行编码,从而压缩储存大小。灰度数据的数值不同,因此每个灰度数据都要进行编码。分类编码进一步压缩打印图片的储存大小。
附图说明
图1为实施例1中3D模型的三维图;
图2为3D模型的一层切片图像的示意图;
图3为图2中A处放大示意图;
图4为实施例1中一种3D打印文件的压缩方法的流程图;
图5为灰度-UV光强关系图;
图6为3D模型的一层切片图像的灰度频次直方图。
其中,1为模型主体,2为模型轮廓,3为背景。
具体实施方式
实施例1
本实施例1采用的3D模型如图1所示,将该3D模型通过切片软件切片,其中一层的切片图像如图2所示。将图2中的A处放大,得到图3。从图2和图3切片图像中可以看出,黑色部分为背景1,灰色部分为模型轮廓2,白色部分为模型主体3。
如图4所示,一种3D打印文件的压缩方法,包括如下步骤:
步骤(1)过滤数据:遍历所有层的图像数据,将像素值小于设定值30的数据设置为0,保存新的图像数据。
位图在描述一个不规则形状时会使用调色技术(也称抗锯齿技术)提高图像边缘平滑度,其中提高平滑度的同时会带入大量的过渡数据,也叫灰度,灰度(即像素值)范围是(0, 255)。
图5的灰度-UV光强关系图描述了不同灰度下,LCD液晶屏幕上的光强值(uw/cm2)。可以看出当像素值小于50的时候,UV光强小于100 uw/cm2。光固化3D打印模型时树脂固化需要达到一定强度的光强值,若低于某一光强值树脂不会固化,故低于一定值的灰度树脂不会固化,这些数据也是无效的,可以舍弃。
如图6所示,灰度频次直方图描述了该切片图像的灰度分布情况,其中近75%是落在(0-30)的数据。如图2和图3所示,这些像素值小于30的数据为打印模型的背景1,属于无效数据,若将这些无效数据每个进行编码,则会占用了许多内存。因此步骤(1)过滤这些无效数据,使其像素值均为0,便于后期数据分类,同样也便于无效数据的编码。
设定值越高,过滤数据越多,降低打印精度;设定值越低,过滤数据越少,压缩效果越差,因此需要根据3D模型的实际情况对设定值进行选择。本实施例中,分析图5和图6的数值后,取设定值为30。
步骤(2)获取差异图并标记每一层:遍历所有层的图像数据,获取当前层与上一层的像素值的差异图,生成差异图时,设△diffPix=当前层像素值-上一层像素值,若△diffPix≥0,直接保存△diffPix;若△diffPix<0,保存255+△diffPix;若当前层与上一层没有区别,则标记当前层非差异层,连续相同的非差异层中,第一个出现的非差异层标记为基准层;若当前层与上一层像素值有区别,则标记当前层为差异层。
本实施例中,3D模型可能会出现若干连续的非差异层,将这些非差异层标记,第一个出现的非差异层标记为基准层。其余的差异层记录其差异图,例如当前层某一行的像素值为(0,0,135,235,245,255,255,255,245,235,135,0,0),上一层该行的像素值为(0,0,125,225,250,255,255,255,250,230,145,0,0),则记录的差异图中该行的像素值为(0,0,10,10,250,0,0,0,250,5,245,0,0)。
步骤(3)数据分类:根据像素值将所有数据分为三类:有效数据、灰度数据和无效数据,有效数据为像素值=255,灰度数据为0<像素值<255,无效数据为像素值=0。
如图2和图3所示,模型主体1为有效数据,模型轮廓2为灰度数据,背景3为无效数据。在3D光固化打印中,有效数据是光强值最大的部分,无效数据是光强值为0的部分,灰度数据是其余的部分,光强值越大,光固化树脂固化越快。
步骤(4)根据当前层类型和数据类型编码:当前层若是基准层,则将该层的所有数据根据有效数据、灰度数据和无效数据进行分类编码;当前若是差异层,则将该层的差异图根据有效数据、灰度数据和无效数据进行分类编码;当前层若是非差异层,则记录其层数。
以基准层为例,将数据进行分类编码的具体步骤如下:
步骤a. 遍历该层每一行内的每一个数据。
步骤b. 当前行像素值为(0,0,0,0,145,240,255,255,255,245,135,0,0,0,0),找到第一个非无效数据145,位置在第5位,从而找到模型轮廓2。
步骤c. 把145之前的无效数据,即连续4个0进行编码写入无效数据队列。无效数据的编码可以为:编码的头两位为00,剩余的位数表示连续无效数据的长度4。
步骤d. 把当前的非无效数据145放入非无效数据队列。
步骤e. 遍历索引值加一后,重复步骤d,将145,240,255,255,255,245,135依次放入非无效数据队列,直到找到非无效数据后的第一个无效数据的位置在第12位,从而找到另一侧的模型轮廓。
步骤f. 非无效数据队列中的数值为:145,240,255,255,255,245,135;连续相同值长度数组I为:1,1,3,1,1;连续相同值长度数组II为2,3,2。编码的时候,根据连续相同值长度数组II,对长度为3的有效数据进行有效数据编码,对其余的数据分别进行灰度数据编码。因此根据连续相同值长度数组II编码,先是灰度数据的编码:头两位为01,第三位表示连续灰度数据长度2,剩余的位数记录长度2内每个灰度数据的值145和240。然后为有效数据编码:头两位为11,剩余的位数表示连续有效数据的长度3。接着依旧是灰度编码:头两位为01,第三位表示连续灰度数据长度2,剩余的位数记录长度2内每个灰度数据的值245和135。
步骤g.无效数据长度累加1。
步骤h.重复步骤b-g,直至将最后4位无效数据0编码写入无效数据队列,完成该行的编码。
步骤i.遍历下一行,重复步骤a-h,直至遍历该层所有行。
以差异层为例,将数据进行分类编码的具体步骤如下:
步骤a. 遍历该层每一行内的每一个数据。
步骤b. 差异图的当前行像素值为(0,0,10,10,250,0,0,0,250,5,245,0,0),找到第一个非无效数据10,位置在第3位。
步骤c. 把10之前的无效数据,即连续2个0进行编码写入无效数据队列。无效数据的编码可以为:编码的头两位为00,剩余的位数表示连续无效数据的长度2。
步骤d. 把当前的非无效数据10放入非无效数据队列。
步骤e. 遍历索引值加一后,重复步骤d,将10,10,250依次放入非无效数据队列,直到找到非无效数据后的第一个无效数据的位置在第6位。
步骤f. 非无效数据队列中的数值为:10,10,250;连续相同值长度数组I为:2,1;连续相同值长度数组II为3。编码的时候,根据连续相同值长度数组II,对数据进行灰度数据编码:头两位为01,第三位表示连续灰度数据长度3,剩余的位数记录长度3内每个灰度数据的值10,10,250。
步骤g.无效数据长度累加1。
步骤h.重复步骤b-g,找到下一个非无效数据250,位置在第9位。把250之前的无效数据,即连续3个0进行编码写入无效数据队列。把250,5,245依次放入非无效数据队列。连续相同值长度数组I:1,1,1;连续相同值长度数组II为3,对这三个非无效数据进行灰度数据的编码。找到非无效数据后的第一个无效数据的位置在第12位。将最后两位无效数据0进行编码写入无效数据队列,完成该行的编码。
步骤i.遍历下一行,重复步骤a-h,直至遍历该层所有行。
步骤(5)重复步骤(4)直至所有层已编码或者已记录层数。
对图2所示的切片图片进行测试,原图8.8M,默认压缩位图文件大小342KB。对原图设定值设置30,直接编码后大小340KB,压缩后大小127KB,压缩率为37.4%。
图1的3D模型切片图片以位图保存,位图文件总大小1.2GB,编码压缩后大小0.75GB,压缩率为62.5%。
以上仅为本发明的具体实施例,但本发明的技术特征并不局限于此。任何以本发明为基础,为解决基本相同的技术问题,实现基本相同的技术效果,所作出地简单变化、等同替换或者修饰等,皆涵盖于本发明的保护范围之中。