Swift 图像处理:iOS 和 macOS 完全指南

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

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

开始课程

Swift 图像处理(iOS/macOS)



图像处理是移动和桌面应用开发中的关键任务之一。在 iOS 和 macOS 的 Swift 中,有许多内置工具可用于加载、显示、处理和保存图像。本文将详细介绍主要方法和 API,帮助您在 Apple 平台上高效处理图形。



用于图像处理的主要类

根据平台不同,使用不同的类:

  • iOS/tvOS/watchOS — UIImage (UIKit)
  • macOS — NSImage (AppKit)

这两个类提供类似的功能,但 API 有所不同。对于跨平台开发,可以使用通用协议或扩展。



加载图像

最简单的方法是从应用资源中加载图像:

// iOSlet image = UIImage(named: "example")

// macOSlet image = NSImage(named: "example")

要从网络加载图像,请使用 URLSession:

guard let url = URL(string: "https://example.com/image.jpg") else { return }

URLSession.shared.dataTask(with: url) { data, response, error in guard let data = data, error == nil else { return } DispatchQueue.main.async { // iOS let image = UIImage(data: data) // macOS let image = NSImage(data: data) }}.resume()


显示图像

要在屏幕上显示图像,请使用相应的视图组件:

  • iOS — UIImageView
  • macOS — NSImageView
// iOSlet imageView = UIImageView(image: UIImage(named: "photo"))imageView.contentMode = .scaleAspectFit

// macOSlet imageView = NSImageView(image: NSImage(named: "photo"))imageView.imageScaling = .scaleProportionallyUpOrDown


使用 Core Image 处理图像

Core Image 是一个用于图像过滤和处理的强大框架。以下是一个应用滤镜的基本示例:

import CoreImage

func applyFilter(to inputImage: CIImage) -> CIImage? { guard let filter = CIFilter(name: "CISepiaTone") else { return nil } filter.setValue(inputImage, forKey: kCIInputImageKey) filter.setValue(0.8, forKey: kCIInputIntensityKey) return filter.outputImage}

// 使用let originalImage = CIImage(image: UIImage(named: "photo")!)!if let filteredImage = applyFilter(to: originalImage) { let context = CIContext() let cgImage = context.createCGImage(filteredImage, from: filteredImage.extent) let resultImage = UIImage(cgImage: cgImage!)}

常用的 Core Image 滤镜:

  • CISepiaTone — 棕褐色调
  • CIGaussianBlur — 高斯模糊
  • CIColorControls — 调整亮度、对比度、饱和度
  • CIVignette — 暗角效果


像素操作与 CGImage

要进行底层像素数据处理,请使用 Core Graphics 中的 CGImage:

func pixelColors(from image: UIImage) -> [[UIColor]]? {    guard let cgImage = image.cgImage else { return nil }    let width = cgImage.width    let height = cgImage.height        let colorSpace = CGColorSpaceCreateDeviceRGB()    let bytesPerPixel = 4    let bytesPerRow = bytesPerPixel * width    let bitsPerComponent = 8    var pixelData = [UInt8](repeating: 0, count: width * height * bytesPerPixel)        guard let context = CGContext(data: &pixelData,                                  width: width,                                  height: height,                                  bitsPerComponent: bitsPerComponent,                    

推荐