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