![减去颜色并提取透明度值](https://linux22.com/image/1449161/%E5%87%8F%E5%8E%BB%E9%A2%9C%E8%89%B2%E5%B9%B6%E6%8F%90%E5%8F%96%E9%80%8F%E6%98%8E%E5%BA%A6%E5%80%BC.png)
假设将一张图片设为半透明,并添加纯色背景。原始图片、背景色和结果(混合)已知。但是,添加的透明度(alpha 值)未知,并且会随着图片而变化。有没有一种自动方法可以计算图像每个像素添加的透明度值?我们可以复制这些值并应用于另一张图片吗?
[ 图片 + 透明度(未知且不同) ] + FlatBackground = 混合(不透明)
= [ 半透明图片 ] + FlatBackground = Mix(opaque)
复制每个添加的与图片像素对应的透明度值的示例:
for pixel(0,0) added 127
for pixel(1,0) added 124
for pixel(0,1) added 124
for pixel(1,1) added 120
但我当然不想打印这些值。我只想像使用 mask(?) 一样使用它。这样,我可以将这些值应用到另一张图片以创建相同的效果。
答案1
透明度乘以原始像素,而不是加到原始像素上,以获得混合像素。请参阅PNG 规范。
假设 8 位颜色样本范围从 0 到 255,并标准化为范围 0 到 1.0,对图像中的每个像素执行此操作:
m = Mix/255
p = Picture/255
a = alpha = Transparency/255
m = (p * a) + (b * (1.0 - a))
求解“a”
a = (m - b) / (p - b)
转换回原始范围,例如 0..255:
Transparency = a * 255
不幸的是,这意味着您无法从所有像素中提取透明度 (alpha)。特别是,当 Picture == Background (p - b == 0) 时,透明度可以是 0..255 范围内的任何值(a == 0.0 到 1.0 之间的任何值);如果您在代码中使用此公式,则需要防止除以零。
当图片背景非零时,则可以获得透明度,但是当差异(p - b)较小时,它不是很准确。