图片叠加混合

把一张图叠到另一张上,用正片叠底压暗、用滤色提亮,透明度、缩放和位置都能拖,合成后直接导出 PNG。

底层图是画布,叠加图是贴上去的素材。可以直接把文件拖进这个面板或按 Ctrl+V 粘贴截图:底图还没有就当作底图,否则当作叠加图。两张图都只在本机处理。

先选一张底层图

使用说明

两层角色的分工要清楚:底层图决定画布大小,也是混合运算的基准;叠加图是贴上去的素材,可以缩放、平移、调透明度。合成顺序永远是先画底层再按模式画叠加层,所以把纹理放上层、把照片放下层是唯一正确的方向,反过来就成了拿纹理当底。

混合模式的数学性质决定了它们的适用范围。正片叠底是逐通道相乘,结果只会更暗,白色等于不变,所以白底的纹理图叠上去后白处会「消失」,只留下纹理本身;滤色是取反相乘再取反,结果只会更亮,黑色等于不变,是光照类和烟雾素材的正解。叠加、强光、柔光会把两层按底图的明暗分别走变暗或变亮两条路,观感更戏剧,但也更容易过曝或糊掉,配合 40% 到 60% 的透明度比较稳。差值算的是两像素差的绝对值,天然适合做对齐检查和对齐失败的可视化。

混合发生在「画布已有的像素」上,所以底下的东西必须是确定且不透明的。工具默认先给整张画布铺一层底色(默认白色),再把底层图按适配方式画上去:完整放入会等比缩到画布内并留白,铺满画布会等比放大到盖满并裁掉超出的部分,两种都不会拉伸变形。画布尺寸默认跟底层图走,切换到按叠加图之后,底层图会重新缩放去铺满新的画布,这一步是为了不丢失叠加图的完整范围。

性能上要有预期:混合模式是逐像素运算,画布到两三千像素以后拖动就会开始掉帧,叠加上大图缩放时更明显。先把原图缩到实际需要的尺寸再合成,比事后后悔快得多。另外浏览器对画布有尺寸上限,超限时 getContext 会直接返回失败,这时只能先缩小图片。导出固定为 PNG,得到的像素与预览逐点一致,不会再被压缩一次。

最后别忘了结果本身是确定的:同一组原图加同一组参数,在 Chrome、Firefox、Safari 上算出的像素一致,差异只可能来自原图解码出来的像素不同。要接着做裁剪或多图排版,用图片裁剪和多图拼接拼图接着处理。

常见问题

为什么同样的混合模式,和设计软件里看着不完全一样?

因为混合模式的取值、公式都写在 CSS Compositing 规范里,浏览器的画布实现都按它算,所以同一组参数在 Chrome、Firefox、Safari 上结果是一致的。差别主要来自输入:设计软件里的图层可能带透明度、处在别的色彩空间,而这里底图是不透明的、按 sRGB 算。只要两张原图相同、参数相同,导出的 PNG 就是逐像素确定的结果。

正片叠底和滤色该怎么选?

看你想让画面变暗还是变亮。正片叠底的结果只会比两层都暗,白色等于透明,所以适合贴纸张纹理、做阴影和旧化;滤色的结果只会比两层都亮,黑色等于透明,适合贴光晕、火光、雾气这类发光素材。剩下那些(叠加、强光、柔光)是把两者按底图明暗混着用,效果更强烈也更容易过头,透明度一般要压到四五成。

叠加图比底图大,会被裁掉吗?

默认会。画布尺寸跟着底层图走,底层图是「画布」、叠加图是「素材」,超出画布的部分被裁掉,这也是合成时最符合直觉的结果。如果你要保留叠加图的完整范围,把画布尺寸改成跟叠加图走,这时底层图会按适配方式(完整放入或铺满裁切)重新缩放去铺满新画布。

换了模式画面却几乎没变化,是怎么回事?

两种常见原因。一是叠加图那块区域本来就是纯白或纯黑,正片叠底遇白、滤色遇黑都不改变底层,自然看不出变化。二是模式还停在「正常」,等于直接把叠加图盖上去,只要透明度是满的,下面的东西就完全看不见了。想快速确认叠加图覆盖了哪里,切回「正常」再把透明度往下拉,一眼就能看出它占的范围。

透明背景的叠加图为什么边缘发黑?

混合模式是在已有的像素上做运算。画布先铺了一层底色(默认白色),透明区域不会被运算,所以 PNG 的透明边不会变黑,但如果你把画布底色改成了深色,或者底图本身是带透明通道的 PNG,半透明的边缘像素就会和深色底算在一起,看着发暗。要么把画布底色设成白色或与素材相近的颜色,要么换成「正常」模式直接覆盖。

怎么把两个元素精确对齐?

在预览图上按住拖动可以粗调,位置由中心和 X、Y 偏移量共同决定,松手后偏移量会同步到滑块和输入框,所以可以先拖再看着数值微调。要做更严格的检查,把混合模式切成「差值」:对齐的地方两个像素几乎相同,会算成一片黑,错位或亮度差的地方会明显发亮,一眼就能看出还差几个像素。

导出的图会不会变小或被压缩?

不会。导出固定为 PNG 无损格式,尺寸就是画布尺寸,逐像素与预览一致。要注意的是画布很大时(两三千像素以上)叠加模式会明显吃性能,拖动会有延迟,先把图缩小到实际需要的大小再合成会顺畅很多。超过浏览器画布上限的大图会被拒绝,这时也只能先缩小。

图片会被上传吗?

不会。混合用浏览器画布完成,两张图都只在本机内存里参与运算,关掉页面就没了。底图要先裁掉多余部分用图片裁剪,多张图拼成一张用多图拼接拼图,拼好之后再叠纹理也行。

相关:图片裁剪多图拼接拼图