CoreImage: фільтри та робота з зображеннями

Автор: IT Sectr Опубліковано: 2026-05-06 Час читання: 9 хв

CoreImage це фреймворк Apple для обробки зображень та відео в реальному часі, що надає десятки вбудованих CIFilter для кольорокорекції, розмиття, накладання текстур та розпізнавання. Згідно з документацією Apple, 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Розмиття за Гаусом з регульованим радіусом
StylizeCIPixellateПікселизація із заданим масштабом
GeometryAdjustCIAffineTransformПоворот, масштаб, зсув через афінну матрицю
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 (максимальний ефект). Зверніть увагу на леніну оцінку: 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 потрібне перетворення координат через афінне перетворення.

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("Людина посміхається")
    }
}

Композиція кількох ефектів

Фінальний приклад демонструє ланцюг з трьох фільтрів: кольорокорекція, вінетування та накладання текстури. Зверніть увагу, що 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 з CIFilter, що дозволяє застосовувати ефекти без копіювання кадрів між CPU та GPU.

Який кольоровий профіль використовує CoreImage за замовчуванням

CoreImage за замовчуванням працює в робочому кольоровому просторі sRGB (kCGColorSpaceSRGB). При створенні CIContext можна вказати альтернативний простір — розширений лінійний 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

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