【发布时间】:2011-09-17 18:38:37
【问题描述】:
我正在使用带有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 和 green = 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 控制颜色。
【问题讨论】:
-
我已经成功地将结果四舍五入,方法是使用高于 0.5 的任何值到下一个最高整数,以及低于任何值的更低整数。您需要确保等式中的所有部分都转换为 CGFloat。
标签: iphone ios ipad core-graphics quartz-2d