创建CGImage时透明度未保留,RGBA字节数组转CGImage无透明度如何解决?
问题核心原因
你在初始化CGBitmapContext时使用了CGImageAlphaInfo.PremultipliedLast枚举值,该配置要求RGB通道已经完成alpha预乘计算(即每个RGB通道的值 = 原始RGB值 * alpha值 / 255),但你代码中直接给RGB通道赋值原始值,没有做预乘处理,导致透明度计算失效。
解决方法
可任选以下任意一种方案修复:
- 方案1:修改alpha枚举配置(改法最简单)
将CGBitmapContext的最后一个参数替换为CGImageAlphaInfo.Last,该配置表示alpha通道在像素末尾、且无需预乘,系统会自动完成透明度混合计算。修改后代码片段如下:image1 = new CGBitmapContext(maskdata.ToArray(), (int)100, (int)100, 8, (int)(100 * 4), CGColorSpace.CreateDeviceRGB(), CGImageAlphaInfo.Last).ToImage(); - 方案2:保留预乘配置,修改像素赋值逻辑
如果你需要保留PremultipliedLast配置,需要在赋值RGB通道时先做预乘计算,循环内代码修改为:byte alpha = 125; // 预乘计算:RGB值 = 原始RGB值 * alpha / 255 colors[4 * i] = (byte)(255 * alpha / 255); // 红色通道预乘 colors[4 * i + 1] = 0; // 绿色原始值为0,预乘后仍为0 colors[4 * i + 2] = 0; // 蓝色原始值为0,预乘后仍为0 colors[4 * i + 3] = alpha; - 额外验证项:
确认承载该UIImage的UIImageView的Opaque属性设置为false,且背景色设置为透明,避免容器属性遮盖图片的透明度效果。
内容的提问来源于stack exchange,提问作者ashok kumar
相关产品推荐
相关产品推荐

