iphone – 如何在没有预乘alpha的情况下获得真正的RGBA或ARGB颜色值?

我正在使用CGBitmapContextCreate和kCG ImageAlphaPremultipliedFirst选项创建位图上下文.

我制作了一个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和green = 245.

如果alpha为0,则红色,绿色和蓝色也为0.这里所有数据都丢失了,我无法弄清楚像素的颜色.

如何完全避免或撤消此alpha预乘,以便我可以根据真实的R G B像素值修改图像中的像素,就像在Photoshop中创建图像时一样?如何恢复R,G,B和A的原始值?

背景信息(这个问题可能没有必要):

我正在做的是:我采用UIImage,将其绘制到位图上下文,以便在其上执行一些简单的图像处理算法,根据之前的颜色移动每个像素的颜色.没什么特别的.但我的代码需要真正的颜色.当一个像素是透明的(意味着它的alpha小于255)时,我的算法不应该关心这个,它应该根据需要修改R,G,B,而Alpha保持不管它是什么.有时虽然它会向上或向下移动alpha.但我认为它们是两个不同的东西. Alpha控制透明度,而R G B控制颜色.

这是一个整数类型的预乘的基本问题:

> 245 *(128/255)= 122.98
> 122.98截断为整数= 122
> 122 *(255/128)= 243.046875

我不确定你为什么得到242而不是243,但这个问题仍然存在,并且α越低越好.

解决方案是使用floating-point components代替. Quartz 2D编程指南给出了the full details of the format you’ll need to use.

重要的一点:您需要在创建原始图像时使用浮点(我认为甚至不可能将这样的图像保存为PNG;您可能必须使用TIFF).已经以整数形式预乘的图像已经失去了这种精度;没有得到它.

零alpha的情况是这个的极端版本​​,甚至浮点也无法帮助你.零(alpha)的任何时间都为零,并且没有从该点恢复原始的未预乘的值.

相关文章
相关标签/搜索