用Filter Factory 制作PhotoShop滤镜 (作者:王 巍)
相信各位PhotoShop爱好者一定都对滤镜非常感兴趣吧,那麽你是否想过自己也来制作的
滤镜呢?下面我就来向大家介绍一个能完成这一任务的最方便的利器——Filter Factory。
Filter Factory也是一个Adobe公司出品的PhotoShop Plugin,包含在光碟版的PhotoShop中
一起发售,不过在默认状态下它并不会自动安装上去。该Plugin也可以在我的网站
PhotoShop
Workshop(http://www.pswork.com.cn)下载,附有英文用户手册及一些范例。
Filter Factory的工作原理并不复杂,你的只需为各颜色通道定义一个表达式,即一个
运算法则,用来作用在各像素上。而Filter Factory便可为你完成馀下的工作:把它编译成
真正的*.8bf Plugin文件。Filter Factory还提供了用户可调节的滑块,图像预览窗口,真
的很不错吧!
用Filter Factory制作的滤镜已经可以满足基本的需求了,在网上有很多很酷的滤镜都
是用 Filter Factory做的,我相信各位中国的PhotoShop好手也一定可以做出同样好的滤镜
来,让「鬼子们」瞧瞧。
下面简单介绍一下Filter Factory(以下简称为FF)的基本用法。
把Ffactory.8bf文件拷到PhotoShop的Plugins目录中後,启动PhotoShop,新建一个RGB
图像文件, 再选择Filter/ Synthetic/ Filter Factory... 便进入FF的设计窗口了(注意:
必须把显示器的分辩率调到800×600小字元或更高的分辩率才能看到完整的FF窗口)。
窗口左上的方框便是预览窗口了,它的右边从上到下共有8个滑块,编号从0 ~ 7,其中
每两个滑块又分为一组,即「0」号和「1」号滑块组成Map0,以此类推。在窗口中间你可以
看到三个方框, 前面分别写着R,G,B,方框内便是让你针对各基色输入表达式的地方了。
窗口的最下面有一排按钮,依次为Load(调出已制作好的滤镜原代码), Save(保存当前编
辑的滤镜原代码),Make(将源代码编译成8bf滤镜文件),Cancel(取消)和 OK(确认)
。在定义好表达式後,如果你不急於将它编译为真正的Plugin文件,可将它按源代码存放,
按Save保存便行了。源代码一样可以当作滤镜使用,但必须通过FF来调用。若按Make踺编译
成真正的Plugin文件後,PhotoShop就可以直接使用它了。另外Load踺用来调出源代码,以便
修改,编辑,运行。
在具体使用之前,我们还得说明一下FF的一些基本概念,在FF中为R(红)、G(绿)、
B(蓝)各通道定义表达式是有语法规则的,它也需要用到常量,变数,函数,运算符等等(
在文章的末尾我整理了一些运算符及常用函数列表。另外大家最好去温习一下解析几何的课
本,对了解这些函数是很有用的。);在FF中,将一个图像中的每个像素都用坐标来进行定
位,原点位於图像的左上角,横坐标即X轴,从左向右开始计数,纵坐标即Y轴,是从上向下
开始计算的。在FF中通常用(x,y)来表示一个像素的位置,而像素的颜色和亮度则用(
r, g, b)来表示,这里r, g, b是指各通道的值,大小在0~255之间。如一个(80,80,80)
的像素代表的是一种暗灰,(255,255,255)是白色,(0,0,0)便是黑色了。
下面我们来看一个最简单的例子:
R:r
G:g+100
B:b
从表达式上可以看出:R、B通道是不变的,而在G通道中对每个像素的「g」值都增加了
100,其结果便是使整个图像都变绿了。
我们再来看一个稍复杂一点的例子:
R:r+rnd(-ct1(1),ctl(1))
G:g+rnd(-ct1(1),ctl(1))
B:b+rnd(-ct1(1),ctl(1))
其中ctl()函数用来获取滑块的取值,ctl(0)即获取0号滑块的值,ctl(1)即获取
1号滑块的值,以此类推。这样,用户便可通过拖动滑块来调节滤镜的效果了。而rnd(x,y
)函数用来产生一个值在x和y之间的随机数。所以这段代码很明显是用来产生Noise(扰乱)
的效果的,而且Noise的强度可以通过滑块来调节, 其中0号、1号和2号滑块分别控制着R, G
和B通道的Noise 强度。
从以上例子可以看出,FF的使用是很方便的。下面我们再研究一个实用滤镜的源代码,
看看FF是如何工作的。在FF中附带有一个叫Lite Pegs的滤镜,它可将原图转化为许多小圆点
,而小圆点的颜色和亮度随原图相应位置的颜色和亮度而变化的。
咱们一步一步来研究如何编写源代码。进入FF,将G和B设为零,只留R通道来试验下面的
代码,便於在输入代码的同时观察预览窗口中的效果。
首先我们来设法画出一个圆来,一般地可以利用c2m(x,y)函数。如代码c2m(x,y)
<10?255:0
其中c2m(x,y)是表示距点(x,y)的范围。这里使用了一个条件判断语句:
表达式?值一:值二
即先判断表达式是否为真,若为真则采用值一,为假则用值二。在这里,便是将距原点
(0,0)的距离小於10的像素赋为255,其它像素则赋为0,我们可以看到在原点处会生成一
个半径为9个像素的圆,当然我们只能看到它的四分之一。
我们可以调节圆的大小和位置,如c2m(x-15,y-30)<20?255:0便是一个圆心位於(15
,30)半径为19的圆。甚至还可以完全通过控制滑块来自己掌握:c2m(x-ctl(1),y-ctl
(2)), >= 小於,不大於,大於,不小於
<<, >> 向左移,向右移
*, /, % 乘,除,取模
+, - 加,减
函数
你可以在算术式中使用下面这些函数。需要注意的是许多函数在它们定义域上可能会有
限制,如果变数值超出范围, 算术式会返回 0 。例如:ctl(8) 的运算结果是 0 ,这是因
为 ctl 函数的定义域介0和7之间。
函数 定义
src(x,y,z) x,y 坐标上像素的 z 色频
rad(d,m,z) 来源影像的 z 色频值,与影像的中心距离 m,角度 d
ctl(i) 滑钮 i 的数值, i 是一个介於 0与 7 之间的整数
val(i,a,b) 滑钮 i 的数值,对应於 a 与 b的范围之间
map(i,n) 色阶配对表格i的第n项值,i是介於0与3之间的整数,n是介於0与255之间
的整数
min(a,b) a 与 b 的较小数
max(a,b) a 与 b 的较大数
abs(a) a 的绝对值
add(a,b,c) a + b 与 c 的较小值
sub(a,b,c) a - b 与 c 的较大值
dif(a,b) a 与 b 的差的绝对值
rnd(a,b) a 与 b 之间的随机数字
mix(a,b,n,d) a 与 b 套入分数 n/d,a*n/d+b*(d-n)/d 的值
scl(a,il,ih,ol,oh) 从输入范围 (il 至 ih) 到输出范围 (ol 至 oh) 之 a 缩放
sqr(x) x 的二次根号值
sin(x) x 正弦,x 是介於 0 与 1024 之间的整数 ,
cos(x) x 余弦, x 是介於 0 与 1024 之间的整数 ,
tan(x) x 正切, x 是介於 0 与 1024 之间的整数 ,
r2x(d,m) 像素的 x,从任意中心点在角度 d、单位 m 的置换
r2y(d,m) 像素的 y,从任意中心点在角度d、单位 m 的置换
c2d(x,y ) 坐标 (x,y) 像素的角度置换
c2m(x,y) 坐标 (x,y) 像素的强度置换
get(i) 将目前储存值传回给 i
put(v,i) 在储存格 i 中放入新值 v