.acv文件是什么

因为毕业设计做的是一个美图类的Android应用程序,所以自然需要实现滤镜这一基本功能。虽然我的滤镜实现使用的是开源的Android-gpuimage,但是作为毕业设计而言,不能仅仅是会写就可以,其内部原理也需要有一定理解才能在答辩的时候不会慌张。所以我根据对GPUImage源码的一些研究以及查找的一些资料来记录下我的App中滤镜的实现过程。

在我实现滤镜的过程中,主要有两种思路,一种是使用RGB矩阵实现,另一种是解析.acv文件来实现。

本文主要是介绍.acv文件是什么。

另外,个人能力有限,如果有不严谨或者错误的地方还请指出,谢啦~

什么是.acv文件?

如果你会使用Photoshop,那么你应该知道在PS中,我们可以通过调整曲线来对图片进行整体的修改,当我们保存我们调整好的曲线时,生成的文件格式就是.acv文件。

acv_save

.acv文件的内容

你可以在Adobe Photoshop File Formats Specification里面找到对这一格式的详细介绍。方便起见,我们在这里根据一个例子进行介绍。

当你保存一个空的曲线(未作修改)时,当你用Sublime Text打开,它的内容可能是这样的:

acv_undecode

等等,这是什么鬼!

我仔细看了一下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条曲线才对,那第五条是什么呢?
    acv_channels

下面引用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通道了。