Swift图像处理:resize与crop(iOS/macOS)

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Swift图像处理:resize与crop(iOS/macOS)



图像处理是iOS和macOS应用开发中的关键任务之一。无论是用户头像上传、照片预览生成,还是图形内容处理,您几乎都需要进行缩放(resize)和裁剪(crop)操作。本文将介绍如何使用Swift内置框架UIKit(适用于iOS)和AppKit(适用于macOS),以及通用的Core Graphics来完成这些任务。



主要方法



在Apple生态系统中,有多种图像处理方式。我们将介绍两种最流行且高效的方法:



  • UIKit / AppKit + Core Graphics — 底层但非常灵活的方法。可以精确控制结果的质量和尺寸。
  • Image I/O — 用于处理图像元数据和编码/解码的框架。非常适合处理大文件时注重性能的场景。


本文将重点介绍第一种方法,因为它最为通用且无需额外依赖。



图像缩放(Resize)



缩放函数接收原始图像和目标尺寸,返回指定参数的新图像。保持宽高比以避免变形非常重要。



iOS示例(UIKit)



import UIKit

extension UIImage { func resized(to targetSize: CGSize) -> UIImage? { // 计算缩放比例,以适应目标尺寸并保持宽高比 let widthRatio = targetSize.width / size.width let heightRatio = targetSize.height / size.height let scale = min(widthRatio, heightRatio) // 保持宽高比的新尺寸 let newSize = CGSize(width: size.width * scale, height: size.height * scale) // 创建新尺寸的图形上下文 UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0) draw(in: CGRect(origin: .zero, size: newSize)) let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage }}

// 使用示例:if let image = UIImage(named: "example"), let resized = image.resized(to: CGSize(width: 300, height: 200)) { // 使用resized图像}


macOS示例(AppKit)



import AppKit

extension NSImage { func resized(to targetSize: NSSize) -> NSImage? { let widthRatio = targetSize.width / size.width let heightRatio = targetSize.height / size.height let scale = min(widthRatio, heightRatio) let newSize = NSSize(width: size.width * scale, height: size.height * scale) let newImage = NSImage(size: newSize) newImage.lockFocus() draw(in: NSRect(origin: .zero, size: newSize), from: NSRect(origin: .zero, size: size), operation: .copy, fraction: 1.0) newImage.unlockFocus() return newImage }}


注意: 在macOS中,UIGraphicsBeginImageContextWithOptions函数不可用。需要使用lockFocus()/unlockFocus()或Core Graphics。


图像裁剪(Crop)



裁剪允许从原始图像中提取矩形区域。常用于创建方形头像或去除多余边缘。



使用Core Graphics的通用方法



import CoreGraphics

extension UIImage { func cropped(to rect: CGRect) -> UIImage? { guard let cgImage = self.cgImage else { ret

推荐