如何在不预乘alpha的情况下获取真实的RGBA或ARGB颜色值?
|
我正在使用带有
kCGImageAlphaPremultipliedFirst
选项的CGBitmapContextCreate
创建位图上下文。
我制作了一个5 x 5的测试图像,其中包含一些主要颜色(纯红色,绿色,蓝色,白色,黑色),一些混合颜色(即紫色)和一些alpha变化。每当alpha分量不为255时,颜色值都是错误的。
我发现当执行以下操作时,我可以重新计算颜色:
almostCorrectRed = wrongRed * (255 / alphaValue);
almostCorrectGreen = wrongGreen * (255 / alphaValue);
almostCorrectBlue = wrongBlue * (255 / alphaValue);
但是问题是,我的计算有时会偏离3甚至更多。例如,对于绿色,我得到的值为242而不是245,我100%确信它必须恰好是245。Alpha是128。
然后,对于PNG位图中具有相同alpha透明度的完全相同的颜色,我得到的alpha = 255和绿色= 245。
如果alpha为0,则红色,绿色和蓝色也为0。这里所有数据都丢失了,我无法弄清像素的颜色。
如何完全避免或完全取消此Alpha预乘,以便可以像在Photoshop中创建图像时一样,根据真实的R G B像素值修改图像中的像素?如何恢复R,G,B和A的原始值?
背景信息(此问题可能不是必需的):
我正在做的是:我将UIImage绘制到位图上下文上,以便对其执行一些简单的图像处理算法,并根据之前的颜色移动每个像素的颜色。没什么特别的。但是我的代码需要真实的颜色。当一个像素是透明的(意味着它的alpha小于255)时,我的算法不会在乎这一点,它只需要根据需要修改R,G,B,而Alpha则保持不变。有时,尽管它也会使alpha向上或向下移动。但是我将它们视为两个独立的事物。 Alpha扭曲了透明度,而R G B控制了颜色。
没有找到相关结果
已邀请:
3 个回复
陷牡彭拈峰
闪脖
怪酞撩匹
您可以在此github链接中找到完整的静态值表。 注意,当原始未预乘像素被预乘时,该方法将不会恢复信息“丢失”。但是,它的确会返回最小的未预乘像素,一旦再次通过预乘逻辑,它将变为预乘像素。当图形子系统仅接受预乘像素(例如OSX上的CoreGraphics)时,此功能很有用。如果图形子系统仅接受预乘像素,那么最好不要存储预乘像素,因为与未预乘像素相比,它消耗的空间更少。