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
相关产品推荐
相关产品推荐

