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

加载到UIImage的图片出现原文件不存在的黑线,原因何在?

iOS灰度图片加载后右侧出现异常黑线

我正在开发一款iOS应用,加载服务器下载的图片时遇到了问题:使用UIImage(contentsOf:)或其他等效UIImage初始化方法加载图片后,图片最右侧会出现一条细黑线,但这条黑线在源文件里根本不存在。

一开始我以为是URLSession的代码有问题,但后来用Affinity Designer创建了同配置的本地图片,同样能复现这个问题。

问题触发的图片特征

  • 颜色模型为Grey,配置为Generic Grey Gamma 2.2 Profile
  • 分辨率为319×350
  • 只要切换为RGB颜色模型,或者修改图片尺寸,问题就会消失
  • 无论是自己创建的同配置图片,还是服务器提供的源图片,都会出现这个问题

源图片本身是纯白色:
源图片

但加载成UIImage后,最右侧像素列出现了凭空生成的黑线:
加载后的UIImage

注:上面的UIImage截图来自Xcode的Quick Look功能,我也通过代码检测确认了这些黑色像素确实存在。

其他测试细节

  • 尝试用CIImage直接加载、或者直接转为CGImage,同样会出现黑线,推测它们调用了相同的底层图像IO代码
  • 问题仅在物理设备上复现,模拟器运行完全正常

验证代码及输出

我写了一段代码加载源图片,检查是否存在非白色像素:

// 加载Stack Overflow上的源图片
guard let url = URL(string: "https://i.sstatic.net/ymCX5.jpg"),
      let data = try? Data(contentsOf: url),
      let image = UIImage(data: data),
      let cgImage = image.cgImage
else {
    print("无法加载图片")
    return
}

// 获取像素数据
guard let pixelData = cgImage.dataProvider?.data,
      let data = CFDataGetBytePtr(pixelData)
else {
    print("无法从CGImage获取数据")
    return
}

// 检查是否为单字节像素(确保后续循环逻辑正确)
let byteCount = CFDataGetLength(pixelData)
let width = cgImage.width
let height = cgImage.height

print("字节总数: \(byteCount)")
guard byteCount == (width * height) else {
    print("像素不是单字节格式")
    return
}

// 遍历所有像素,查找非白色(255)的像素
for byteOffset in 0..<byteCount {
    if data[byteOffset] != 255 {
        print("发现非白色像素 \(data[byteOffset]),位置:X: \((byteOffset % width) + 1), Y: \((byteOffset / width) + 1)")
    }
}

输出结果示例:

发现非白色像素 254,位置:X: 316, Y: 1
发现非白色像素 254,位置:X: 317, Y: 1
发现非白色像素 1,位置:X: 318, Y: 1
发现非白色像素 0,位置:X: 319, Y: 1
...(后续类似输出)

有没有人遇到过这类问题?知道原因是什么吗?


内容的提问来源于stack exchange,提问作者Matt Cox

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 01:31:20