在我寻求为 Matlab 中的图像混合工具添加 Alpha 功能时,我遇到了一些障碍。其中,我一直在使用these http://ssp.impulsetrain.com/porterduff.html links http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/PDF32000_2008.pdf作为我关于前景和背景 Alpha 如何影响输出颜色数据和输出 Alpha 的组成的参考。
我最初的方法是简单地使用 aSrc-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
令人好奇的地方在于,我从概念上不明白为什么人们会采用最少的阿尔法层进行合成。当然,这种方法会产生与 GIMP 匹配的结果,但如果我不理解其推理,我会不愿意将其设置为默认行为。
最好向某个 GIMP 论坛询问这个问题,但我认为接触普通受众会更有效。澄清和总结:
- 透明 BG 区域中的颜色不受与不透明前景色相乘的影响,这有意义吗?在未来的某些操作中,这是否会导致硬掩模边缘附近未改变的数据泄露的风险?
- 虽然没找到,但是还有其他的应用吗
那里使用这种方法?
我使用 GIMP 的行为作为参考是否错误?我没有PS
相比之下,ImageMagick 是如此灵活,以至于它不
确实暗示了一种特定的预期行为。当然,GIMP 有
有些事情它做得不正确;也许这是别的东西
可能会改变。
编辑:
我至少可以通过回避来回答最后一个问题。我决定添加对 SVG 1.2 和旧版 GIMP 方法的支持。 GIMP 将来使用的 GEGL 方法将遵循 SVG 方法,因此我认为这表明了遗留方法的适当性。
无论如何,SVG 方法都基于 Porter-DuffSrc-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;
如果你想简化它,然后做一些代数。