UIImageView混合alpha值为0的颜色异常问题如何解决?
UIImageView透明区域异常显色问题解决方案
问题根源
alpha为0的像素仍残留颜色的异常,本质是预乘Alpha的数值规则不匹配导致的渲染错误:
- 创建CGContext时指定了
CGImageAlphaInfo.premultipliedLast,该模式要求RGB三个通道的数值必须预先乘以对应Alpha值,当Alpha为0时,RGB三个通道也必须为0,否则渲染混合时会残留RGB分量 - 代码中alpha=0的像素设置为(255,0,0,0),不符合预乘规则,红色分量在混合时会叠加到底层蓝色上,最终呈现粉色;而alpha=0的黑色像素(0,0,0,0)符合规则,所以能正常显示透明
- 白色背景下差异不明显是因为红色叠加白色和透明白色视觉差异极小,才会误以为表现正常

修复方案
方案1:遵守预乘Alpha规则
在设置Alpha为0的像素时,同步将RGB三个通道赋值为0,修改对应代码即可:
if y == 7 || y == 8 || y == 9 { // 预乘模式下alpha为0时RGB必须为0 setColorFor(0, g: 0, b: 0, a: 0, x: x, y: y) }
方案2:切换为非预乘Alpha模式
创建CGContext时将bitmapInfo改为非预乘模式,系统渲染时会自动处理Alpha混合,不需要提前对RGB做预乘处理:
let ctx = CGContext(data: pixelPointer, width: imageWidth, height: imageHeight, bitsPerComponent: 8, bytesPerRow: 4 * imageWidth, space: CGColorSpaceCreateDeviceRGB(), bitmapInfo: CGImageAlphaInfo.last.rawValue)!
两种方案任选其一即可实现预期效果,alpha为0的区域会完全透出下层视图的颜色。
内容的提问来源于stack exchange,提问作者Skyler Lauren
相关产品推荐
相关产品推荐

