Swift图像处理:iOS和macOS平台的resize与crop操作
图像处理是移动和桌面应用开发中最常见的任务之一。在Apple平台(iOS和macOS)上,调整图像大小(resize)和裁剪(crop)可以使用内置框架(iOS的UIKit,macOS的AppKit),也可以使用强大的底层框架Core Graphics。本文将介绍适用于两个平台的通用方法,并提供现成的Swift代码示例。
图像处理的主要方法
在Swift中调整图像大小或裁剪图像主要有三种方式:
- UIKit(iOS/tvOS) — 使用
UIImage类及其draw(in:)方法或UIGraphicsImageRenderer。 - AppKit(macOS) — 使用
NSImage类并结合NSGraphicsContext进行操作。 - Core Graphics(Quartz 2D) — 跨平台底层C语言框架,同时适用于iOS和macOS。基于
CGImage和图形上下文。
为了通用性,我们将使用Core Graphics,因为它编写的代码可以轻松适配两个平台。不过,对于iOS项目,使用UIGraphicsImageRenderer通常更方便——它更简单且速度更快。
调整图像大小(Resize)
resize函数接收原始图像(UIImage或NSImage)和新尺寸(CGSize)。算法很简单:创建一个所需尺寸的图形上下文,将原始图像绘制到其中,然后从上下文中提取新图像。
iOS示例(UIKit)
import UIKit
extension UIImage { func resized(to newSize: CGSize) -> UIImage? { let renderer = UIGraphicsImageRenderer(size: newSize) return renderer.image { _ in self.draw(in: CGRect(origin: .zero, size: newSize)) } }}
// 使用方式:if let image = UIImage(named: "example"), let resized = image.resized(to: CGSize(width: 300, height: 200)) { // 使用resized图像}macOS示例(AppKit + Core Graphics)
import AppKit
extension NSImage { func resized(to newSize: NSSize) -> NSImage? { guard let cgImage = self.cgImage(forProposedRect: nil, context: nil, hints: nil) else { return nil } let bitmap = NSBitmapImageRep( bitmapDataPlanes: nil, pixelsWide: Int(newSize.width), pixelsHigh: Int(newSize.height), bitsPerSample: 8, samplesPerPixel: 4, hasAlpha: true, isPlanar: false, colorSpaceName: .deviceRGB, bitmapFormat: .alphaFirst, bytesPerRow: 0, bitsPerPixel: 0 ) guard let context = NSGraphicsContext(bitmapImageRep: bitmap!) else { return nil } NSGraphicsContext.saveGraphicsState() NSGraphicsContext.current = context let rect = NSRect(origin: .zero, size: newSize) self.draw(in: rect, from: .zero, operation: .copy, fraction: 1.0) NSGraphicsContext.restoreGraphicsState() let newImage = NSImage(size: newSize) newImage.addRepresentation(bitmap!) return newImage }}裁剪图像(Crop)
裁剪(crop)是从原始图像中提取一个矩形区域。在Core Graphics中,使用CGImage的cropping(to:)函数。需要注意的是,Core Graphics中的坐标原点位于左下角,因此对于iOS(Y轴方向向下),可能需要进行坐标转换。