You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 10:06:01