前面讲图层时留了一个默认设定没展开:正常(Normal)模式下,上面一层只要不透明,下面那层就被完全盖住。这一篇要讲的混合模式,改的正是这一步。
参与计算的其实只有两个像素
图层面板左上角那个写着“正常”的下拉框里有二十几个选项。不管选哪一个,Photoshop 做的事都一样:把上层某个像素的值和下层同一位置的像素值,按这个模式的公式算一遍,算出来的就是最终看到的颜色1。然后对每个像素重复一遍,像素之间互不影响。
两个输入有固定名字:
- 底色(base):这个图层底下所有可见图层合成后的结果,也就是“原来是什么样”。
- 上层色(blend):当前这个图层对应位置的像素。
计算按红、绿、蓝三个通道分开做,算法完全一样。所以混合模式改的不只是明暗,也会改颜色。
正片叠底:把两个数相乘
把亮度写成 0 到 1 之间的小数(纯黑是 0,纯白是 1),正片叠底(Multiply)的公式短得只有三个符号:
8 位图像的量程是 0 到 255,整数运算就是同一个式子再除以 2552。代入数字:底色是 200 的浅灰,上层是 128 的中灰,
200 变成约 100,明显变暗。
为什么只会变暗?两个乘数都在 0 和 1 之间,乘积不可能比任何一个乘数更大,结果只会“更小或相等”3。而“相等”正是它最有用的地方。
白色的 1 和黑色的 0:去白留黑是怎么来的
- 上层是纯白(1):结果 。下层原样显示,上面这层等于不存在。
- 上层是纯黑(0):结果 。不管下面是什么,这里一律变黑。
这就是“去白留黑”的来历:上层白的地方不起作用,黑的地方直接涂黑,中间的灰按比例把下层压暗。Adobe 的说明用的也是这两句话——乘黑得黑,乘白不变4。
白纸上签的名、拍的印章、网上找的白底图标,拖进照片改成正片叠底,白底就自己消失,只留下黑色笔画。它并不是“把白色抠掉”,而是白色在乘法里不产生任何影响。只是真正等于 255 的白并不多,扫描件和 JPEG 压缩会在白底上留下 250 左右的杂点,叠上去就是一层淡淡的灰影。
滤色:把同一套乘法作用在“反过来的图”上
滤色(Screen)一句话就能记住:先把两个数都反相,相乘,再把乘积反相。
换成 0 到 255 的写法是 2。还是代入两个 128:。同样一对中灰,正片叠底算出 64,滤色算出 192,正好落在 255 的另一侧。
两个极端也跟着翻过来:上层纯黑(0)反相后是 1,乘完还是底色,下层原样显示;上层纯白(1)反相后是 0,乘出来是 0,再反相回来是纯白,这里变成白4。
所以滤色是“去黑留白”。黑底上的火焰、光斑、星空,拖进来设成滤色,黑色背景直接消失,只剩发光的部分。
中性色:每种模式都有一块“什么都不做”的颜色
对照上面两条会发现一个结构:每种混合模式都有一个不改变画面的颜色。 正片叠底的中性色是白,滤色的是黑,后面要讲的叠加(Overlay)和柔光(Soft Light)是 50% 灰。
这不是巧合,而是模式定义的一部分。Photoshop 新建图层时有个“用(模式)中性色填充”的选项,就是给这层填一块按当前模式算下来不产生任何变化的颜色:看着是空的,但有实实在在的像素,可以接受滤镜和其他操作5。
不透明度管“用了多少”,不管“往哪变”
混合模式决定方向和形状——往暗里走(正片叠底)、往亮里走(滤色),还是别的走向。不透明度决定用量:把混合结果和原来的底色按比例掺一遍。通行的合成规则写成一条式子就是这样6:
是不透明度,100% 写作 1。还拿底色 200、上层 128 灰这一对像素举例,正片叠底的全量结果约是 100:
| 不透明度 | 计算 | 结果 |
|---|---|---|
| 100% | 100 | |
| 50% | 150 | |
| 25% | 175 | |
| 10% | 190 |
不透明度只是在把结果从 100 往 200 那边拉,方向始终没变,变暗一直在发生,只是越来越轻。它是一根两头固定的插值杆子,一端是“全量混合”,一端是“原样不动”。
这顺便解释了一个立刻能验证的现象:如果上层那个像素是纯白,正片叠底算出的混合结果等于底色,插值两端是同一个数,于是 不管把不透明度拖到多少,画面一点都不变。白色不挡事是混合模式的性质,跟透明度没关系。反过来,想把正片叠底的效果“少用一点”该动不透明度,但没法靠调不透明度让它只去白、不压暗别的颜色——那是换模式才能解决的事。
边界:公式算的是存下来的数值
这些乘法作用在文档实际存储的数值上,不是人眼感知的亮度。8 位 sRGB 里中灰是 128,看着像“一半亮”,但它离感知上的一半还差很远,所以两个中灰相乘得到 64,肉眼觉得暗得不成比例。这不是软件算错,是这个数值空间本来就不线性。
上手的判断顺序
- 素材是白底还是黑底?白底用正片叠底,黑底用滤色。这一步选错,后面怎么调都不对。
- 幅度太重就降不透明度;不存在“只少去一点白”这种操作。
- 只要效果落在局部,就给这层加蒙版,把不要的地方涂黑——用法和前几篇完全一样。
自己验算两道:
问题一:底色仍是 200,上层放一块纯白,混合模式正片叠底,不透明度 30%。这块地方最后是多少?
还是 200。纯白是正片叠底的中性色,混合结果就是 200,插值两端是同一个数,改任何不透明度都不变。
问题二:底色 200、上层 128 灰,正片叠底、不透明度 10%,结果大约多少?
约 190。虽然只差 10 个亮度级别,但 8 位图像里 10 级已经看得出来;只要不透明度不是 0,变化就一直在。
回到开头:混合模式只做了一件事——在“上层盖住下层”之前插进一个逐像素的公式。正片叠底把两边相乘,白色是 1,所以白的不起作用;滤色把两边反相再乘,黑色是 0,反相之后变成 1,所以黑的不起作用。至于这个公式的效果要用几成,交给不透明度。以后看到调整图层、填充图层上的混合模式下拉框,可以套用同一套理解——只不过那里的“上层色”换成了调整之后的结果。