Pro*_*ber 6 iphone core-graphics quartz-2d ipad ios
我正在使用CGBitmapContextCreate该kCGImageAlphaPremultipliedFirst选项创建一个位图上下文.
我制作了一个5 x 5的测试图像,其中包含一些主要颜色(纯红色,绿色,蓝色,白色,黑色),一些混合颜色(即紫色)和一些alpha变化.每次alpha分量不是255时,颜色值都是错误的.
我发现当我做类似的事情时,我可以重新计算颜色:
almostCorrectRed = wrongRed * (255 / alphaValue);
almostCorrectGreen = wrongGreen * (255 / alphaValue);
almostCorrectBlue = wrongBlue * (255 / alphaValue);
Run Code Online (Sandbox Code Playgroud)
但问题是,我的计算有时会减少3甚至更多.所以例如我得到的值为242而不是245的绿色,我100%确定它必须正好是245. Alpha是128.
然后,对于PNG位图中具有不同alpha不透明度的完全相同的颜色,我得到alpha = 255和green = 245.
如果alpha为0,则红色,绿色和蓝色也为0.这里所有数据都丢失了,我无法弄清楚像素的颜色.
如何完全避免或撤消这个alpha预乘,以便我可以根据真实的RGB像素值修改图像中的像素,就像在Photoshop中创建图像时一样?如何恢复R,G,B和A的原始值?
背景信息(这个问题可能没有必要):
我正在做的是:我采用UIImage,将其绘制到位图上下文,以便在其上执行一些简单的图像处理算法,根据之前的颜色移动每个像素的颜色.没什么特别的.但我的代码需要真正的颜色.当一个像素是透明的(意味着它的alpha小于255)时,我的算法不应该关心这个,它应该根据需要修改R,G,B,而Alpha保持不管它是什么.有时虽然它会向上或向下移动alpha.但我认为它们是两个不同的东西.Alpha控制透明度,而RGB控制颜色.
这是一个整数类型的预乘的基本问题:
我不确定你为什么得到242而不是243,但这个问题仍然存在,并且α越低越好.
解决方案是使用浮点组件.Quartz 2D Programming Guide提供了您需要使用的格式的完整详细信息.
重要的一点:您需要在创建原始图像时使用浮点(我认为甚至不可能将这样的图像保存为PNG;您可能必须使用TIFF).已经以整数形式预乘的图像已经失去了这种精度; 没有得到它.
零alpha的情况是这个的极端版本,甚至浮点也无法帮助你.零(alpha)的任何时间都为零,并且没有从该点恢复原始的未预乘的值.
| 归档时间: |
|
| 查看次数: |
3739 次 |
| 最近记录: |