Swift(iOS/macOS)中的图像处理
在本文中,我们将详细探讨如何在 Swift 中为 iOS 和 macOS 平台处理图像。您将学习如何使用 Apple 的内置框架:UIKit(iOS)、AppKit(macOS)和 Core Image 来加载、显示、处理和保存图像。本材料对新手和经验丰富的开发者都很有用。
用于图像处理的主要框架
在 Apple 生态系统中,有几种处理图像的方法。主要方法如下:
- UIKit(iOS/tvOS) —
UIImage、UIImageView - AppKit(macOS) —
NSImage、NSImageView - Core Image — 用于图像处理(滤镜、变换)的强大框架
- SwiftUI — 用于声明式显示的
Image
在 iOS 中加载图像(UIKit)
在 iOS 中加载图像最简单的方法是使用 UIImage。以下是从资源目录和文件中加载的示例:
// 从 Assets.xcassets 加载let imageFromAssets = UIImage(named: "myImage")
// 从 Bundle 中的文件加载if let path = Bundle.main.path(forResource: "photo", ofType: "jpg") { let imageFromFile = UIImage(contentsOfFile: path)}
// 从 Data 加载if let data = try? Data(contentsOf: URL(string: "https://example.com/image.png")!) { let imageFromData = UIImage(data: data)}在 UIKit 中显示图像
使用 UIImageView 来显示图像:
let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))imageView.image = UIImage(named: "example")imageView.contentMode = .scaleAspectFitview.addSubview(imageView)在 macOS 中处理图像(AppKit)
在 macOS 中使用 NSImage 和 NSImageView:
// 加载图像let nsImage = NSImage(named: "macImage")
// 显示let imageView = NSImageView(frame: NSRect(x: 0, y: 0, width: 300, height: 200))imageView.image = nsImageimageView.imageScaling = .scaleProportionallyUpOrDownview.addSubview(imageView)使用 Core Image 处理图像
Core Image 提供了数十种内置滤镜。让我们看看基本操作:
import CoreImage
// 从 UIImage 创建 CIImageguard let uiImage = UIImage(named: "input"), let ciImage = CIImage(image: uiImage) else { return }
// 应用“高斯模糊”滤镜let filter = CIFilter(name: "CIGaussianBlur")filter?.setValue(ciImage, forKey: kCIInputImageKey)filter?.setValue(10.0, forKey: kCIInputRadiusKey)
// 获取结果guard let outputImage = filter?.outputImage else { return }
// 转换回 UIImagelet context = CIContext(options: nil)if let cgImage = context.createCGImage(outputImage, from: outputImage.extent) { let blurredImage = UIImage(cgImage: cgImage)}流行的 Core Image 滤镜
CISepiaTone— 棕褐色CIPhotoEffectMono— 黑白效果CIVignette— 暗角效果CIColorControls— 亮度、对比度、饱和度CICrop— 裁剪图像
在 SwiftUI 中处理图像
SwiftUI 提供了一种简单且声明式的图像处理方式:
import SwiftUI
struct ContentView: View { var body: some View { Image("swiftui_image") .resizable() .scaledToFit() .frame(width: 200, height: 200) .clipShape(Circle()) .overlay(Circle().stroke(Color.blue, lineWidth: 4)) .shadow(radius: 10) }}