因为毕业设计做的是一个美图类的Android应用程序,所以自然需要实现滤镜这一基本功能。虽然我的滤镜实现使用的是开源的Android-gpuimage,但是作为毕业设计而言,不能仅仅是会写就可以,其内部原理也需要有一定理解才能在答辩的时候不会慌张。所以我根据对GPUImage源码的一些研究以及查找的一些资料来记录下我的App中滤镜的实现过程。
在我实现滤镜的过程中,主要有两种思路,一种是使用RGB矩阵实现,另一种是解析.acv文件来实现。
本文主要是介绍.acv文件是什么。
另外,个人能力有限,如果有不严谨或者错误的地方还请指出,谢啦~
什么是.acv文件?
如果你会使用Photoshop,那么你应该知道在PS中,我们可以通过调整曲线来对图片进行整体的修改,当我们保存我们调整好的曲线时,生成的文件格式就是.acv文件。
.acv文件的内容
你可以在Adobe Photoshop File Formats Specification里面找到对这一格式的详细介绍。方便起见,我们在这里根据一个例子进行介绍。
当你保存一个空的曲线(未作修改)时,当你用Sublime Text打开,它的内容可能是这样的:
等等,这是什么鬼!
我仔细看了一下sublime默认打开的编码格式——UTF-16BE,但是根据Adobe公司的文档,这里面应该全是short int型的数字序列,所以这个编码格式没有办法正确解析。
好吧,那么我们换成以16进制:
0004 0005 0002 0000 0000 00ff 00ff 0002
0000 0000 00ff 00ff 0002 0000 0000 00ff
00ff 0002 0000 0000 00ff 00ff 0002 0000
0000 00ff 00ff
简单的分一下组:
0004 0005
0002 0000 0000 00ff 00ff
0002 0000 0000 00ff 00ff
0002 0000 0000 00ff 00ff
0002 0000 0000 00ff 00ff
0002 0000 0000 00ff 00ff
有没有感觉有点规律,接下来我们把它转成10进制:
4 5
2 0 0 255 255
2 0 0 255 255
2 0 0 255 255
2 0 0 255 255
2 0 0 255 255
好的,这就是.acv文件的真实面目了,简单介绍下:
第一个数字4是版本号,长度为2,可以等于1或者等于4;
第二个数字分两种情况讨论:
- 版本号==1时,表示文件中曲线的位图(bit map of curves in file);
- 版本号==4时,表示文件中曲线的总数。因为版本号为4,所以5表示文件中共有5条曲线;
接下来是5串相同的序列,数量等于第二个数字5,因为我们保存的曲线没有任何调整,所以每一条曲线都是空的。每一条曲线的第一个数字2表示这条曲线有几个点,之后
0,0
表示原点,255,255
表示终点;- 当你调整曲线的时候,你可以调整的有
RGB通道
,R通道
,G通道
和B通道
,以及自定义的通道
,但是我们并没有新建通道,所以应该有4条曲线才对,那第五条是什么呢?
下面引用Photoshop Help/Channel basic中的原文:
As long as you save a file in a format supporting the image’s color mode, the color channels are preserved. Alpha channels are preserved only when you save a file in Photoshop, PDF, TIFF, PSB, or raw formats. DCS 2.0 format preserves only spot channels. Saving in other formats may cause channel information to be discarded.
大概意思是,只要你保存文件的格式支持图像颜色模式,那么颜色通道(rgb)都会被保留。但Alpha通道只有你在使用PS保存文件为PDF,TIFF,PSB或者原始格式时才会保留。DCS 2.0格式只保留专色通道,使用其他格式保存可能会丢失通道信息。
由此可以推测出,最后一条曲线,就是Alpha通道
了。