Swift图像处理:iOS/macOS平台的resize与crop操作

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

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

开始课程

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轴方向向下),可能需要进行坐标转换。



适用于iOS和macOS的通用crop函数

\

推荐