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

UIImage按比例调整尺寸:指定宽度自动计算高度

解决UIImage指定宽度并保持宽高比的缩放问题

嘿,我看到你正在编写UIImage的扩展来实现图片缩放,刚好遇到了代码拼写错误和逻辑优化的问题,我帮你修正并调整成符合需求的版本——指定目标宽度,自动按原比例计算高度,同时保证缩放后的图片清晰度。

修正并优化后的完整代码

extension UIImage {
    // 通用缩放方法:传入任意CGSize,按比例适配(修正了原代码的拼写错误)
    func resize(to newSize: CGSize) -> UIImage? {
        let originalSize = self.size
        let widthRatio = newSize.width / originalSize.width
        let heightRatio = newSize.height / originalSize.height
        
        // 取较小的比例,保证图片完整显示在目标尺寸内
        let scaleRatio = min(widthRatio, heightRatio)
        let scaledSize = CGSize(width: originalSize.width * scaleRatio, height: originalSize.height * scaleRatio)
        
        // 使用UIGraphicsImageRenderer绘制,适配Retina屏幕
        let renderer = UIGraphicsImageRenderer(size: scaledSize)
        return renderer.image { context in
            self.draw(in: CGRect(origin: .zero, size: scaledSize))
        }
    }
    
    // 便捷方法:仅指定目标宽度,自动按原比例计算高度
    func resize(toTargetWidth targetWidth: CGFloat) -> UIImage? {
        let originalSize = self.size
        guard originalSize.width > 0 else { return nil }
        
        // 计算保持宽高比的目标高度
        let scaleRatio = targetWidth / originalSize.width
        let targetHeight = originalSize.height * scaleRatio
        
        return resize(to: CGSize(width: targetWidth, height: targetHeight))
    }
}

关键说明

  • 修正原代码问题:你原代码里的heig是拼写错误,应该是height,我已经修正了这个问题。
  • 适配Retina屏幕:使用UIGraphicsImageRenderer替代旧的UIGraphicsBeginImageContext,它会自动处理屏幕scale,避免缩放后的图片模糊。
  • 便捷方法更贴合需求:新增的resize(toTargetWidth:)方法直接接收目标宽度,内部自动计算对应高度,完全符合你“指定宽度、保持比例”的需求。
  • 安全判断:加入了originalSize.width > 0的判断,避免除以0的崩溃。

示例用法

// 假设你有一张原始图片
let originalImage = UIImage(named: "yourImage")!
// 缩放至宽度200px,高度自动计算
let resizedImage = originalImage.resize(toTargetWidth: 200)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:19:20