加载到UIImage的图片出现原文件不存在的黑线,原因何在?
iOS灰度图片加载后右侧出现异常黑线
我正在开发一款iOS应用,加载服务器下载的图片时遇到了问题:使用UIImage(contentsOf:)或其他等效UIImage初始化方法加载图片后,图片最右侧会出现一条细黑线,但这条黑线在源文件里根本不存在。
一开始我以为是URLSession的代码有问题,但后来用Affinity Designer创建了同配置的本地图片,同样能复现这个问题。
问题触发的图片特征
- 颜色模型为Grey,配置为Generic Grey Gamma 2.2 Profile
- 分辨率为319×350
- 只要切换为RGB颜色模型,或者修改图片尺寸,问题就会消失
- 无论是自己创建的同配置图片,还是服务器提供的源图片,都会出现这个问题
源图片本身是纯白色:
但加载成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
相关产品推荐
相关产品推荐

