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

UIGraphics无法生成cgImage,游戏平铺管道图片渲染失败求解决

修复建议:SwiftUI平铺管道图片渲染问题

你的代码存在几个关键问题,导致调整大小后的平铺图片无法正常渲染,以下是具体修复方案:

问题1:强制解包触发崩溃

初始状态下reImage为nil,直接使用Image(uiImage: reImage!)会引发运行时崩溃,替换为可选绑定的安全写法:

if let reImage = reImage {
    Image(uiImage: reImage)
        .resizable()
        .scaledToFit()
} else {
    Text("未生成图片")
        .foregroundColor(.gray)
}

问题2:绘图上下文未适配Retina屏幕

UIGraphicsBeginImageContext不支持Retina屏幕,会导致生成的图片模糊或渲染异常。改用支持屏幕缩放的初始化方法:

// 替换原UIGraphicsBeginImageContext(size)
UIGraphicsBeginImageContextWithOptions(size, false, 0.0)

第三个参数传0.0会自动匹配当前设备的屏幕缩放比例,保证图片清晰度。

问题3:坐标系不匹配导致平铺异常

Core Graphics与UIKit的坐标系Y轴方向相反,直接使用CGContext的draw(_:in:byTiling:)会导致图片翻转,且平铺逻辑不符合预期。改用UIImage的drawAsPattern(in:)方法,自动处理平铺和坐标系适配:

修改后的resizeImage函数:

func resizeImage(textures: (pipe: String, cap: String), of size: CGSize) -> UIImage? {
    guard let textureUIImage = UIImage(named: textures.pipe) else {
        return nil
    }
    
    UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
    textureUIImage.drawAsPattern(in: CGRect(origin: .zero, size: size))
    let tiledImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    
    return tiledImage
}

完整修复代码

import SwiftUI

struct ContentView: View {
    @State var reImage: UIImage?
    
    var body: some View {
        VStack {
            Image("pipe-green")
                .resizable()
                .scaledToFit()
            
            if let reImage = reImage {
                Image(uiImage: reImage)
                    .resizable()
                    .scaledToFit()
            } else {
                Text("未生成图片")
                    .foregroundColor(.gray)
            }
            
            Button("生成平铺管道") {
                let sizeNew = CGSize(width: 100, height: 300)
                reImage = resizeImage(textures: (pipe: "pipe-green", cap: "bottom-green"), of: sizeNew)
            }
        }
        .padding()
    }
    
    func resizeImage(textures: (pipe: String, cap: String), of size: CGSize) -> UIImage? {
        guard let textureUIImage = UIImage(named: textures.pipe) else {
            return nil
        }
        
        UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
        textureUIImage.drawAsPattern(in: CGRect(origin: .zero, size: size))
        let tiledImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        
        return tiledImage
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 23:09:09