CoreImage — это фреймворк Apple для обработки изображений и видео в реальном времени, предоставляющий десятки встроенных CIFilter для цветокоррекции, размытия, наложения текстур и распознавания. По данным Apple Documentation, CoreImage использует GPU для высокопроизводительной обработки пикселей на устройствах iOS. Фреймворк поддерживает CIImage как неизменяемый объект изображения и цепочки фильтров для композиции эффектов без потери качества.
Главное
CoreImage — это фреймворк Apple для обработки растровых изображений и видео, впервые представленный в macOS 10.4 Tiger и портированный на iOS 5.0. В отличие от Core Graphics или UIKit, CoreImage работает на уровне пиксельных шейдеров, используя GPU для параллельных вычислений. Это позволяет применять сложные эффекты — размытие, цветокоррекцию, морфинг — к изображениям мегапиксельного разрешения за миллисекунды.
Архитектура CoreImage построена на концепции ленивых вычислений (lazy evaluation): CIFilter не выполняет обработку до момента рендеринга в CIContext. Разработчик собирает цепочку из нескольких CIFilter, соединяя выход одного фильтра со входом другого, и только вызов render запускает полноценный конвейер GPU. Это минимизирует количество проходов через видеокарту и сохраняет производительность.
CoreImage поддерживает широкий цветовой охват (P3, sRGB, линейный sRGB), HDR-изображения и работу с 16-битными и 32-битными пиксельными форматами. На устройствах с Neural Engine CoreImage может комбинировать GPU-шейдеры с Core ML для интеллектуальной обработки — например, автоматической цветокоррекции на основе машинного обучения, как реализовано в приложении Фото на iOS 17.
Три основных класса образуют ядро CoreImage: CIImage (данные), CIFilter (операция) и CIContext (среда выполнения). Каждый класс отвечает за свою фазу конвейера и не смешивает ответственность.
CIImage — это легковесный объект, который описывает изображение, но не содержит пиксельных данных напрямую. Он может быть создан из UIImage, CGImage, текстуры Metal, GL-текстуры или файла на диске. CIImage неизменяем — любое применение фильтра порождает новый CIImage без изменения исходного. Это позволяет строить цепочки преобразований без копирования данных между шагами.
Важная особенность: CIImage не привязан к разрешению экрана или цветовому пространству до момента рендеринга. Один и тот же CIImage можно отрендерить в UIImage для экрана и в TIFF-файл для печати с разными параметрами — CoreImage автоматически адаптирует обработку под целевой контекст.
CIFilter — основной класс для применения эффектов. Каждый CIFilter представляет собой шейдерную программу с входными параметрами (inputImage, inputIntensity, inputRadius и т.д.) и одним выходным изображением. Apple поставляет более 200 встроенных CIFilter, сгруппированных по категориям: CICategoryColorEffect (цветокоррекция), CICategoryBlur (размытие), CICategoryStylize (стилизация), CICategoryGeometryAdjust (геометрические трансформации).
Для создания кастомного CIFilter разработчик пишет Metal-шейдер (CIKernel) — фрагментный шейдер на языке Metal Shading Language, который обрабатывает каждый пиксель независимо. После компиляции шейдер регистрируется как подкласс CIFilter и может использоваться в цепочках наравне со встроенными фильтрами Apple.
| Категория | Пример фильтра | Назначение |
|---|---|---|
| ColorEffect | CIColorControls | Яркость, контраст, насыщенность |
| Blur | CIGaussianBlur | Размытие по Гауссу с adjustable radius |
| Stylize | CIPixellate | Пикселизация изображения с заданным масштабом |
| GeometryAdjust | CIAffineTransform | Поворот, масштаб, сдвиг через affine-матрицу |
| Composite | CISourceOverCompositing | Наложение изображений с альфа-каналом |
CIContext — это тяжеловесный объект, который управляет выделением GPU-ресурсов, компиляцией шейдеров и буферизацией. Создание CIContext — дорогая операция, поэтому Apple рекомендует создавать его один раз на весь жизненный цикл приложения и переиспользовать. Контекст привязан к конкретному GPU (Metal, OpenGL) или CPU и определяет цветовое пространство выходного изображения.
Библиотека CIFilter постоянно расширяется: iOS 17 добавила новые фильтры для HDR-обработки и машинного обучения. Все встроенные фильтры задокументированы в Apple Developer Documentation, их можно искать по категориям или названиям. Для обнаружения доступных фильтров на устройстве используйте CIFilter.filterNames(inCategory:).
Главная возможность CoreImage — композиция нескольких CIFilter в цепочку. Выход одного фильтра подаётся на вход другого через параметр inputImage. CoreImage оптимизирует цепочку на этапе рендеринга: соседние фильтры, работающие в одном цветовом пространстве, объединяются в один GPU-проход (kernel fusion). Это даёт выигрыш в производительности без вмешательства разработчика.
Для создания собственного эффекта разработчик пишет Metal-функцию с аннотацией [[kernel]]. Функция принимает координаты пикселя и возвращает цвет. CoreImage передаёт шейдер на GPU, где он выполняется параллельно для всех пикселей изображения. Кастомные фильтры особенно полезны для уникальных визуальных эффектов: сепия с нелинейной кривой, дисперсионное размытие или имитация плёночного зерна.
#include <CoreImage/CoreImage.h>
[[kernel]] float4 customFilter(sample_t s, float intensity) {
float4 result;
result.rgb = s.rgb * (1.0 - intensity) + s.r * intensity;
result.a = s.a;
return result;
}
CoreImage автоматически управляет кэшем промежуточных результатов. Если одна и та же цепочка фильтров применяется к разным изображениям, CoreImage может переиспользовать скомпилированные шейдеры. Для максимальной производительности избегайте создания CIContext на каждый кадр — используйте один контекст и переустанавливайте входные параметры фильтра.
CIDetector — подсистема CoreImage для обнаружения семантических объектов на изображении без использования Vision или Core ML. CIDetector поддерживает четыре типа детекции: лиц (CIDetectorTypeFace), текста (CIDetectorTypeText), QR-кодов (CIDetectorTypeQRCode) и прямоугольников (CIDetectorTypeRectangle). Детектор работает на CPU с оптимизацией под NEON-инструкции, что обеспечивает стабильную скорость на устройствах без мощного GPU.
Детектор лиц CIDetectorTypeFace возвращает массив CIFaceFeature с координатами границ лица, положением глаз и рта. С iOS 12 CIDetector также определяет улыбку (hasSmile) и положение левого/правого глаза (leftEyeClosed, rightEyeClosed). Точность детекции достаточна для большинства AR- и фото-приложений, но для критичных сценариев Apple рекомендует Vision.framework.
CIDetectorTypeRectangle находит прямоугольные области на изображении — документы, визитки, экраны устройств. Детектор возвращает CIRectangleFeature с четырьмя точками, образующими контур прямоугольника. По данным WWDC 2024, детектор прямоугольников использует ту же нейросетевую архитектуру, что и Vision, но с меньшим потреблением памяти. Это делает его предпочтительным для обработки потока кадров в реальном времени, например, в приложениях сканера документов.
Практические примеры помогут закрепить понимание CoreImage. Рассмотрим два типовых сценария: применение цветового фильтра к фотографии и детекцию лиц с отрисовкой рамки.
Базовый пример CISepiaTone фильтра, который преобразует цветное изображение в тона сепии. Фильтр принимает параметр inputIntensity от 0 (исходное) до 1 (максимальный эффект). Обратите внимание на lazy-оценку: CIImage, возвращаемый filter.outputImage, не содержит пикселей — рендеринг происходит только при вызове context.createCGImage.
import CoreImage
guard let inputImage = CIImage(image: uiImage) else { return }
let filter = CIFilter(name: "CISepiaTone")
filter?.setValue(inputImage, forKey: kCIInputImageKey)
filter?.setValue(0.8, forKey: kCIInputIntensityKey)
let context = CIContext()
let outputImage = filter?.outputImage
let cgImage = context.createCGImage(outputImage!, from: inputImage.extent)
let resultImage = UIImage(cgImage: cgImage!)
Следующий пример использует CIDetector для поиска лиц на изображении и отрисовки прямоугольника вокруг каждого найденного лица. CIFaceFeature содержит координаты в системе изображения (начало в левом нижнем углу), поэтому при отрисовке на UIKit требуется преобразование координат через affine transform.
let detector = CIDetector(
ofType: CIDetectorTypeFace,
context: context,
options: [CIDetectorAccuracy: CIDetectorAccuracyHigh]
)
let features = detector?.features(in: inputImage) as? [CIFaceFeature]
for face in features ?? [] {
print("Face bounds: \(face.bounds)")
if face.hasSmile {
print("Person is smiling")
}
}
Финальный пример демонстрирует цепочку из трёх фильтров: цветокоррекция, виньетирование и наложение текстуры. Обратите внимание, что outputImage первого фильтра передаётся как inputImage второму — без промежуточного рендеринга. При вызове createCGImage CoreImage объединяет все три операции в один GPU-проход.
let colorFilter = CIFilter(name: "CIColorControls")
colorFilter?.setValue(inputImage, forKey: kCIInputImageKey)
colorFilter?.setValues([
kCIInputBrightnessKey: 0.1,
kCIInputContrastKey: 1.2
])
let vignetteFilter = CIFilter(name: "CIVignette")
vignetteFilter?.setValue(colorFilter?.outputImage, forKey: kCIInputImageKey)
vignetteFilter?.setValue(2.0, forKey: "inputRadius")
let finalImage = vignetteFilter?.outputImage
let result = context.createCGImage(finalImage!, from: inputImage.extent)
Часто задаваемые вопросы
CoreImage работает на GPU и оптимизирован для пиксельных операций (фильтры, цветокоррекция), а Core Graphics — CPU-библиотека для векторной отрисовки и 2D-контекстов. CoreImage быстрее для массовой обработки изображений, Core Graphics точнее для пошаговой отрисовки интерфейса.
Да — CoreImage поддерживает обработку отдельных кадров видео через AVPlayerItemVideoOutput или AVCaptureOutput. Для потоковой обработки используйте AVVideoComposition with CIFilter, что позволяет применять эффекты без копирования кадров между CPU и GPU.
CoreImage по умолчанию работает в рабочем цветовом пространстве sRGB (kCGColorSpaceSRGB). При создании CIContext можно указать альтернативное пространство — extended linear sRGB для HDR или Display P3 для дисплеев с широкой гаммой.
Ограничения на количество фильтров в цепочке нет, но каждые 5–7 последовательных фильтров создают дополнительный GPU-проход. Для более чем 10 фильтров рекомендуется разбить цепочку на группы и рендерить промежуточные результаты, чтобы избежать превышения лимита регистров шейдера.
Да — CIDetector работает на CPU с использованием NEON-инструкций на всех устройствах с iOS 5.0 и выше. Точность детекции одинакова на всех устройствах, но скорость выше на чипах Apple A12+ из-за аппаратного ускорения нейросетей.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также