Swift(iOS/macOS)中的图像处理:完整指南

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

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

开始课程

Swift(iOS/macOS)中的图像处理

在本文中,我们将探讨在Apple生态系统中处理图像的主要方法和工具。您将学习如何使用Swift内置框架在iOS和macOS上加载、显示、处理和保存图像。本材料对新手和有经验的开发者都很有用。



用于图像处理的主要框架

在Swift中,有几个用于图形处理的关键框架:

  • UIKit(iOS) — UIImage、UIImageView
  • AppKit(macOS) — NSImage、NSImageView
  • Core Image — 滤镜和处理
  • Core Graphics — 底层绘图
  • Metal — 用于复杂操作的GPU加速
  • SwiftUI — 使用Image的声明式界面


加载和显示图像

让我们看看两个平台的基本示例。



iOS(UIKit)

import UIKit

// 从assets加载let image = UIImage(named: "example")

// 从文件加载if let path = Bundle.main.path(forResource: "photo", ofType: "jpg") { let imageFromFile = UIImage(contentsOfFile: path)}

// 在UIImageView中显示let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))imageView.image = imageimageView.contentMode = .scaleAspectFit


macOS(AppKit)

import AppKit

// 从assets加载let image = NSImage(named: "example")

// 从文件加载if let path = Bundle.main.path(forResource: "photo", ofType: "jpg") { let imageFromFile = NSImage(contentsOfFile: path)}

// 在NSImageView中显示let imageView = NSImageView(frame: NSRect(x: 0, y: 0, width: 200, height: 200))imageView.image = imageimageView.imageScaling = .scaleProportionallyUpOrDown


SwiftUI(跨平台)

import SwiftUI

struct ContentView: View { var body: some View { Image("example") .resizable() .aspectRatio(contentMode: .fit) .frame(width: 200, height: 200) }}


使用Core Image处理图像

Core Image提供了超过200个内置滤镜用于图像处理。以下是应用棕褐色调的示例:



import CoreImage

func applySepiaFilter(to image: UIImage) -> UIImage? { guard let ciImage = CIImage(image: image) else { return nil } let filter = CIFilter(name: "CISepiaTone") filter?.setValue(ciImage, forKey: kCIInputImageKey) filter?.setValue(0.8, forKey: kCIInputIntensityKey) guard let outputImage = filter?.outputImage else { return nil } let context = CIContext() guard let cgImage = context.createCGImage(outputImage, from: outputImage.extent) else { return nil } return UIImage(cgImage: cgImage)}


调整大小和裁剪

经常需要调整图像大小或居中裁剪:



extension UIImage {    func resized(to targetSize: CGSize) -> UIImage {        let renderer = UIGraphicsImageRenderer(size: targetSize)        return renderer.image { _ in            self.draw(in: CGRect(origin: .zero, size: targetSize))        }    }        func croppedToSquare() -> UIImage {        let side = min(size.width, size.height)        let x = (size.width - side) / 2        let y = (size.height - side) / 2        let cropRect = CGRect(x: x, y: y, width: side, height: side)                guard let cgImage = cgImage?.cropping(to: cropRect) else { return self }        return UIImage(cgImage: cgImage)    }}


保存图像

让我们看看如何将图像保存到相册或文件:

推荐