使用UIGraphicsImageRenderer绘制大图遇GPU限制问题求助
解决大尺寸图像绘制的GPU尺寸限制问题
核心原因
你的图像尺寸(5073×8663)超过了当前设备GPU的纹理尺寸上限,导致UIGraphicsImageRenderer默认的GPU渲染模式失败,最终生成空白图。
直接解决方案:强制CPU渲染
修改UIGraphicsImageRendererFormat,指定使用CPU渲染,绕过GPU的尺寸限制。调整后的代码如下:
let format = UIGraphicsImageRendererFormat() format.scale = 1 format.preferredRange = .cpu // 强制使用CPU渲染,避免GPU尺寸限制 let renderer = UIGraphicsImageRenderer(size: borderSize, format: format) let newImage = renderer.image { context in // 绘制原图到目标区域 image.draw(in: imageRect) // 绘制带文字的边框示例 let borderColor = UIColor.black.cgColor context.cgContext.setStrokeColor(borderColor) context.cgContext.setLineWidth(20) // 设置边框宽度 context.cgContext.stroke(context.format.bounds) // 绘制边框路径 // 绘制边框文字(示例:顶部居中) let text = "自定义边框文字" let textAttributes: [NSAttributedString.Key: Any] = [ .font: UIFont.systemFont(ofSize: 40), .foregroundColor: UIColor.white ] let textSize = text.size(withAttributes: textAttributes) let textRect = CGRect( x: (borderSize.width - textSize.width)/2, y: 10, // 距离顶部边框的间距 width: textSize.width, height: textSize.height ) text.draw(in: textRect, withAttributes: textAttributes) }
注意事项
- CPU渲染速度慢于GPU,大尺寸图像绘制建议放在后台线程执行,避免阻塞主线程。
- 大尺寸图像会占用较多内存:5073×8663的RGBA图像(scale=1)约占177MB,需确保设备有足够内存,必要时可降低图像分辨率或调整scale值。
备选方案:分块绘制(极端大尺寸场景)
如果CPU渲染仍因内存问题失败,可将图像和边框拆分为多个小块分别绘制,最后拼接成完整图像。这种方式实现复杂,仅推荐用于超过单张图像内存上限的极端场景。
内容的提问来源于stack exchange,提问作者K.B.
相关产品推荐
相关产品推荐

