Работа с изображениями в Swift (iOS/macOS): полное руководство

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с изображениями в 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 = .scaleAspectFit
view.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 = nsImage
imageView.imageScaling = .scaleProportionallyUpOrDown
view.addSubview(imageView)

Обработка изображений с Core Image

Core Image предоставляет десятки встроенных фильтров. Рассмотрим базовые операции:

import CoreImage

// Создаем CIImage из UIImage
guard 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 }

// Конвертируем обратно в UIImage
let 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)
    }
}

Сохранение изображений

Сохранение изображения в файловую систему:

// Сохранение UIImage в файл
func saveImage(_ image: UIImage, named name: String) {
    guard let data = image.jpegData(compressionQuality: 0.8) else { return }
    let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
    let fileURL = documentsDirectory.appendingPathComponent("\(name).jpg")
    
    do {
        try data.write(to: fileURL)                    

Рекомендаций