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Гаусово замућење са подешивим радијусом
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 (максимални ефекат). Обратите пажњу на лењиво оцењивање: 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("Особа се смеје")
    }
}

Композиција више ефеката

Финални пример приказује ланац од три филтера: корекцију боја, винетирање и наношење текстуре. Обратите пажњу да се 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 — Apple оквир са GPU убрзањем за обраду слика и видеа на iOS и macOS
  • CIImage, CIFilter и CIContext чине трослојну архитектуру са лењивим израчунавањем
  • Више од 200 уграђених CIFilter покрива већину задатака корекције боја, замућења и стилизације
  • Прилагођени филтери се креирају кроз Metal CIKernel са анотацијом [[kernel]]
  • CIDetector проналази лица, текст, QR кодове и правоугаонике без повезивања Vision.framework
  • Ланци филтера се аутоматски оптимизују кроз kernel fusion у један GPU пролаз
  • За обраду видеа у реалном времену користите AVVideoComposition са CIFilter

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође