Работа с изображениями в 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)