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

iOS:图片转Data时尺寸改变,如何保持原尺寸?

UIImage转Data后尺寸变大的解决办法

问题根源

用UIImage(named:)加载图片时,系统会根据设备屏幕的缩放因子(比如@2x、@3x)自动调整图片的实际输出像素尺寸。你看到的680×400是图片的原始像素,但加载后UIImage的scale属性可能被设为设备的屏幕缩放值(比如3),调用pngData()时,会按照「显示尺寸 × scale」来生成图片数据,最终就出现了2040×1800的放大结果。

三种可行解决方案

1. 直接从文件路径加载原始图片

绕开UIImage(named:)的自动缩放处理,直接读取Bundle里的原始图片文件:

if let imagePath = Bundle.main.path(forResource: "profile", ofType: "png"),
   let imageData = try? Data(contentsOf: URL(fileURLWithPath: imagePath)),
   let originalImage = UIImage(data: imageData) {
    // 这里的originalImage scale为1,尺寸就是原始的680×400
    let correctData = originalImage.pngData()
}

2. 重新绘制指定scale的图片

如果必须用UIImage(named:)加载,重新绘制时指定scale为1,强制输出原始尺寸:

let profileImage = UIImage(named: "profile")!
// 创建scale为1的绘图上下文
UIGraphicsBeginImageContextWithOptions(profileImage.size, false, 1.0)
profileImage.draw(in: CGRect(origin: .zero, size: profileImage.size))
let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

if let correctImage = scaledImage {
    let imageData = correctImage.pngData()
    // 此时的imageData对应原始680×400尺寸
}

3. 用扩展修改UIImage的scale

写个简单扩展直接调整图片的scale属性,不用重新绘制:

extension UIImage {
    func resetScale(to scale: CGFloat) -> UIImage? {
        guard let cgImage = self.cgImage else { return nil }
        return UIImage(cgImage: cgImage, scale: scale, orientation: self.imageOrientation)
    }
}

// 使用示例
let profileImage = UIImage(named: "profile")!
if let correctImage = profileImage.resetScale(to: 1.0) {
    let imageData = correctImage.pngData()
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 20:30:36