CoreImage: что это, фильтры и работа с изображениями

Автор: IT Sectr Опубликовано: 2026-05-06 Время чтения: 9 мин

CoreImage — это фреймворк Apple для обработки изображений и видео в реальном времени, предоставляющий десятки встроенных CIFilter для цветокоррекции, размытия, наложения текстур и распознавания. По данным Apple Documentation, CoreImage использует GPU для высокопроизводительной обработки пикселей на устройствах iOS. Фреймворк поддерживает CIImage как неизменяемый объект изображения и цепочки фильтров для композиции эффектов без потери качества.

Главное

  • CoreImage — фреймворк Apple для GPU-ускоренной обработки изображений и видео на iOS и macOS
  • CIFilter — базовый строительный блок с более чем 200 встроенными эффектами и поддержкой кастомных Metal-шейдеров
  • CIImage — неизменяемый объект, представляющий изображение в конвейере CoreImage без привязки к конкретному формату
  • CIDetector — компонент для распознавания лиц, текста, QR-кодов и прямоугольников на изображении
  • GPU-обработка — CoreImage автоматически использует Metal или OpenGL для параллельных вычислений на GPU

Что такое CoreImage

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

Три основных класса образуют ядро CoreImage: CIImage (данные), CIFilter (операция) и CIContext (среда выполнения). Каждый класс отвечает за свою фазу конвейера и не смешивает ответственность.

CIImage — неизменяемый источник

CIImage — это легковесный объект, который описывает изображение, но не содержит пиксельных данных напрямую. Он может быть создан из UIImage, CGImage, текстуры Metal, GL-текстуры или файла на диске. CIImage неизменяем — любое применение фильтра порождает новый CIImage без изменения исходного. Это позволяет строить цепочки преобразований без копирования данных между шагами.

Важная особенность: CIImage не привязан к разрешению экрана или цветовому пространству до момента рендеринга. Один и тот же CIImage можно отрендерить в UIImage для экрана и в TIFF-файл для печати с разными параметрами — CoreImage автоматически адаптирует обработку под целевой контекст.

CIFilter — операция обработки

CIFilter — основной класс для применения эффектов. Каждый CIFilter представляет собой шейдерную программу с входными параметрами (inputImage, inputIntensity, inputRadius и т.д.) и одним выходным изображением. Apple поставляет более 200 встроенных CIFilter, сгруппированных по категориям: CICategoryColorEffect (цветокоррекция), CICategoryBlur (размытие), CICategoryStylize (стилизация), CICategoryGeometryAdjust (геометрические трансформации).

Для создания кастомного CIFilter разработчик пишет Metal-шейдер (CIKernel) — фрагментный шейдер на языке Metal Shading Language, который обрабатывает каждый пиксель независимо. После компиляции шейдер регистрируется как подкласс CIFilter и может использоваться в цепочках наравне со встроенными фильтрами Apple.

КатегорияПример фильтраНазначение
ColorEffectCIColorControlsЯркость, контраст, насыщенность
BlurCIGaussianBlurРазмытие по Гауссу с adjustable radius
StylizeCIPixellateПикселизация изображения с заданным масштабом
GeometryAdjustCIAffineTransformПоворот, масштаб, сдвиг через affine-матрицу
CompositeCISourceOverCompositingНаложение изображений с альфа-каналом

CIContext — среда рендеринга

CIContext — это тяжеловесный объект, который управляет выделением GPU-ресурсов, компиляцией шейдеров и буферизацией. Создание CIContext — дорогая операция, поэтому Apple рекомендует создавать его один раз на весь жизненный цикл приложения и переиспользовать. Контекст привязан к конкретному GPU (Metal, OpenGL) или CPU и определяет цветовое пространство выходного изображения.

CIFilter: встроенные фильтры и кастомные Metal-шейдеры

Библиотека CIFilter постоянно расширяется: iOS 17 добавила новые фильтры для HDR-обработки и машинного обучения. Все встроенные фильтры задокументированы в Apple Developer Documentation, их можно искать по категориям или названиям. Для обнаружения доступных фильтров на устройстве используйте CIFilter.filterNames(inCategory:).

Цепочка из нескольких фильтров

Главная возможность CoreImage — композиция нескольких CIFilter в цепочку. Выход одного фильтра подаётся на вход другого через параметр inputImage. CoreImage оптимизирует цепочку на этапе рендеринга: соседние фильтры, работающие в одном цветовом пространстве, объединяются в один GPU-проход (kernel fusion). Это даёт выигрыш в производительности без вмешательства разработчика.

Кастомные фильтры через CIKernel

Для создания собственного эффекта разработчик пишет Metal-функцию с аннотацией [[kernel]]. Функция принимает координаты пикселя и возвращает цвет. CoreImage передаёт шейдер на GPU, где он выполняется параллельно для всех пикселей изображения. Кастомные фильтры особенно полезны для уникальных визуальных эффектов: сепия с нелинейной кривой, дисперсионное размытие или имитация плёночного зерна.

metal
#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: распознавание лиц, текста и объектов

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, но с меньшим потреблением памяти. Это делает его предпочтительным для обработки потока кадров в реальном времени, например, в приложениях сканера документов.

Примеры кода: фильтры и детекция в Swift

Практические примеры помогут закрепить понимание CoreImage. Рассмотрим два типовых сценария: применение цветового фильтра к фотографии и детекцию лиц с отрисовкой рамки.

Применение сепии к изображению

Базовый пример CISepiaTone фильтра, который преобразует цветное изображение в тона сепии. Фильтр принимает параметр inputIntensity от 0 (исходное) до 1 (максимальный эффект). Обратите внимание на lazy-оценку: CIImage, возвращаемый filter.outputImage, не содержит пикселей — рендеринг происходит только при вызове context.createCGImage.

swift
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.

swift
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-проход.

swift
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 отличается от Core Graphics?

CoreImage работает на GPU и оптимизирован для пиксельных операций (фильтры, цветокоррекция), а Core Graphics — CPU-библиотека для векторной отрисовки и 2D-контекстов. CoreImage быстрее для массовой обработки изображений, Core Graphics точнее для пошаговой отрисовки интерфейса.

Можно ли применять CoreImage к видео в реальном времени?

Да — CoreImage поддерживает обработку отдельных кадров видео через AVPlayerItemVideoOutput или AVCaptureOutput. Для потоковой обработки используйте AVVideoComposition with CIFilter, что позволяет применять эффекты без копирования кадров между CPU и GPU.

Какой цветовой профиль использует CoreImage по умолчанию?

CoreImage по умолчанию работает в рабочем цветовом пространстве sRGB (kCGColorSpaceSRGB). При создании CIContext можно указать альтернативное пространство — extended linear sRGB для HDR или Display P3 для дисплеев с широкой гаммой.

Сколько фильтров CIFilter можно объединить в цепочку?

Ограничения на количество фильтров в цепочке нет, но каждые 5–7 последовательных фильтров создают дополнительный GPU-проход. Для более чем 10 фильтров рекомендуется разбить цепочку на группы и рендерить промежуточные результаты, чтобы избежать превышения лимита регистров шейдера.

Работает ли CIDetector на устройствах без Neural Engine?

Да — CIDetector работает на CPU с использованием NEON-инструкций на всех устройствах с iOS 5.0 и выше. Точность детекции одинакова на всех устройствах, но скорость выше на чипах Apple A12+ из-за аппаратного ускорения нейросетей.

Итоги

  • CoreImage — GPU-ускоренный фреймворк Apple для обработки изображений и видео на iOS и macOS
  • CIImage, CIFilter и CIContext образуют трёхзвенную архитектуру с ленивыми вычислениями
  • Более 200 встроенных CIFilter покрывают большинство задач цветокоррекции, размытия и стилизации
  • Кастомные фильтры создаются через Metal CIKernel с аннотацией [[kernel]]
  • CIDetector находит лица, текст, QR-коды и прямоугольники без подключения Vision.framework
  • Цепочки фильтров автоматически оптимизируются через kernel fusion в один GPU-проход
  • Для обработки видео в реальном времени используйте AVVideoComposition с CIFilter

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также