在我寻求在 Matlab 中为我的图像混合工具添加 alpha 容量时,我遇到了一些障碍。其中,我一直使用这些 链接作为我的参考,以了解前景和背景 alpha 如何影响输出颜色数据和输出 alpha 的组合。
我最初的方法是简单地将 aa Src-Over合成用于“正常”混合模式,将Src-Atop合成用于其他模式。与 GIMP 的输出相比,这产生了相似但不同的结果。输出 alpha 匹配,但 RGB 数据不同。
具体来说,在背景 alpha 为零的情况下,前景对背景的颜色影响为零。在花了几个小时天真地浏览 GIMP 2.8.10 源代码后,我注意到一些让我感到困惑的事情。
除非在导出期间发生的某些模式和一些我尚未在代码中收集到的辅助事情,否则该方法大致如下:
if ~normalmode
FGalpha = min(FGalpha, BGalpha); % << why this?
end
FGalpha = FGalpha * mask * opacity;
OUTalpha = BGalpha + (1 - BGalpha) * FGalpha;
ratio = FGalpha / (OUTalpha + eps);
OUT = OUT * ratio + BG * (1 - ratio);
if normalmode
OUT = cat(3, OUT, OUTalpha);
else
OUT = cat(3, OUT, BGalpha);
end
好奇的地方在于,我从概念上不理解为什么要使用最少的图层 alpha 进行合成。当然,这种方法会产生与 GIMP 匹配的结果,但如果我不理解其中的原因,我会觉得将其设置为默认行为会让人感到不舒服。
这可能最好在某个地方的 GIMP 论坛上提出,但我认为接触普通观众会更有成效。澄清和总结:
- 透明 BG 区域中的颜色不受与不透明前景色相乘的影响是否有意义?这种风险不会导致硬掩模边缘附近未更改的数据在未来的某些操作中溢出吗?
- 虽然我没有找到任何东西,但还有其他使用这种方法的应用程序吗?
使用 GIMP 的行为作为参考我错了吗?我没有 PS 可以比较,而且 ImageMagick 非常灵活,它并没有真正暗示特定的预期行为。当然,GIMP 有些事情做错了。也许这是其他可能会改变的事情。
编辑:我至少可以通过避免它来回答最后一个问题。我决定添加对 SVG 1.2 和旧版 GIMP 方法的支持。GIMP 将来使用的 GEGL 方法遵循 SVG 方法,因此我认为这表明了遗留方法的适当性。
值得一提的是,SVG 方法都基于 Porter-Duff Src-Over组合。如果参考文档,混合数学相同的事实会被混淆,因为混合和合成是使用预乘 alpha 进行代数组合以降低总体计算成本。除了 SoftLight,核心混合数学与 GIMP 和其他地方使用的相同。
只需执行以下操作即可使任何其他混合操作(例如 PinLight、Hue)兼容:
As = Sa * (1 - Da);
Ad = Da * (1 - Sa);
Ab = Sa * Da;
Ra = As + Ad + Ab; % output alpha
Rc = ( f(Sc,Dc)*Ab + Sc*As + Dc*Ad ) / Ra;
如果你想简化它,然后做一些代数。