CoreImage — Apple tərəfindən təsvirlərin və videoların real vaxt rejimində işlənməsi üçün çərçivədir, rəng korreksiyası, bulanıqlaşdırma, faktura əlavə etmə və aşkarlama üçün onlarla daxili CIFilter təqdim edir. Apple Documentation məlumatına görə, CoreImage iOS cihazlarında yüksək performanslı piksel emalı üçün GPU-dan istifadə edir. Çərçivə CIImage-i dəyişməz təsvir obyekti və keyfiyyət itkisi olmadan effektlərin kompozisiyası üçün filtr zəncirlərini dəstəkləyir.
Əsas məqamlar
CoreImage — Apple tərəfindən raster təsvirlərin və videoların emalı üçün çərçivədir, ilk dəfə macOS 10.4 Tiger-də təqdim edilmiş və iOS 5.0-a port edilmişdir. Core Graphics və ya UIKit-dən fərqli olaraq, CoreImage piksel şeyderləri səviyyəsində işləyir, paralel hesablamalar üçün GPU-dan istifadə edir. Bu, megapiksel təsvirlərə milisaniyələr ərzində mürəkkəb effektlər — bulanıqlaşdırma, rəng korreksiyası, morfing — tətbiq etməyə imkan verir.
CoreImage arxitekturası tənbəl hesablama (lazy evaluation) konsepsiyasına əsaslanır: CIFilter CIContext-də render anına qədər emalı yerinə yetirmir. Tərtibatçı bir neçə CIFilter-dən zəncir qurur, bir filtrin çıxışını digərinin girişinə birləşdirir və yalnız render çağırışı tam GPU boru kəmərini işə salır. Bu, video kart vasitəsilə keçidlərin sayını minimuma endirir və performansı qoruyur.
CoreImage geniş rəng gamutunu (P3, sRGB, xətti sRGB), HDR təsvirlərini və 16-bit və 32-bit piksel formatları ilə işi dəstəkləyir. Neural Engine olan cihazlarda CoreImage GPU şeyderlərini Core ML ilə birləşdirərək ağıllı emal edə bilər — məsələn, iOS 17-də Foto proqramında olduğu kimi maşın öyrənməsinə əsaslanan avtomatik rəng korreksiyası.
Üç əsas sinif CoreImage-in özəyini təşkil edir: CIImage (məlumat), CIFilter (əməliyyat) və CIContext (icra mühiti). Hər bir sinif boru kəmərinin öz fazasına cavabdehdir və məsuliyyətləri qarışdırmır.
CIImage — təsviri təsvir edən, lakin birbaşa piksel məlumatları ehtiva etməyən yüngül obyektdir. UIImage, CGImage, Metal teksturası, GL teksturası və ya diskdəki fayldan yaradıla bilər. CIImage dəyişməzdir — filtrin hər tətbiqi orijinalı dəyişdirmədən yeni CIImage yaradır. Bu, addımlar arasında məlumatların kopyalanması olmadan transformasiya zəncirləri qurmağa imkan verir.
Vacib xüsusiyyət: CIImage render anına qədər ekran təsvir ölçüsünə və ya rəng məkanına bağlı deyil. Eyni CIImage-i ekran üçün UIImage-ə və çap üçün TIFF faylına müxtəlif parametrlərlə render etmək olar — CoreImage avtomatik olaraq emalı hədəf kontekstə uyğunlaşdırır.
CIFilter — effektlərin tətbiqi üçün əsas sinifdir. Hər bir CIFilter giriş parametrləri (inputImage, inputIntensity, inputRadius və s.) və bir çıxış təsviri olan şeyder proqramıdır. Apple 200-dən çox daxili CIFilter təqdim edir, kateqoriyalar üzrə qruplaşdırılmışdır: CICategoryColorEffect (rəng korreksiyası), CICategoryBlur (bulanıqlaşdırma), CICategoryStylize (stilizasiya), CICategoryGeometryAdjust (həndəsi transformasiyalar).
Fərdi CIFilter yaratmaq üçün tərtibatçı Metal şeyderi (CIKernel) yazır — hər pikseli müstəqil emal edən Metal Shading Language dilində fraqment şeyderi. Kompilyasiyadan sonra şeyder CIFilter-in alt sinfi kimi qeydiyyatdan keçirilir və Apple-ın daxili filtrləri ilə bərabər zəncirlərdə istifadə edilə bilər.
| Kateqoriya | Filtrlər nümunəsi | Təyinat |
|---|---|---|
| ColorEffect | CIColorControls | Parlaqlıq, kontrast, doyma |
| Blur | CIGaussianBlur | Tənzimlənən radiusla Qauss bulanıqlaşdırması |
| Stylize | CIPixellate | Müəyyən miqyasla təsvirin pikselizasiyası |
| GeometryAdjust | CIAffineTransform | Affin matrisi vasitəsilə fırlanma, miqyas, sürüşmə |
| Composite | CISourceOverCompositing | Alfa kanalı ilə təsvirlərin üst-üstə qoyulması |
CIContext — GPU resurslarının ayrılması, şeyderlərin kompilyasiyası və buferləşdirilməsini idarə edən ağır obyektdir. CIContext yaratmaq bahalı əməliyyatdır, buna görə Apple onu proqramın bütün həyat dövrü üçün bir dəfə yaratmağı və təkrar istifadə etməyi tövsiyə edir. Kontekst xüsusi GPU-ya (Metal, OpenGL) və ya CPU-ya bağlıdır və çıxış təsvirinin rəng məkanını müəyyən edir.
CIFilter kitabxanası daim genişlənir: iOS 17 HDR emalı və maşın öyrənməsi üçün yeni filtrlər əlavə etmişdir. Bütün daxili filtrlər Apple Developer Documentation-da sənədləşdirilmişdir, onları kateqoriyalar və ya adlar üzrə axtarmaq olar. Cihazda mövcud filtrləri aşkar etmək üçün CIFilter.filterNames(inCategory:) istifadə edin.
Əsas imkan CoreImage — bir neçə CIFilter-in zəncirdə kompozisiyası. Bir filtrin çıxışı digərinin girişinə inputImage parametri vasitəsilə verilir. CoreImage render mərhələsində zənciri optimallaşdırır: eyni rəng məkanında işləyən qonşu filtrlər bir GPU keçidində (kernel fusion) birləşdirilir. Bu, tərtibatçının müdaxiləsi olmadan performans qazancı verir.
Öz effektini yaratmaq üçün tərtibatçı [[kernel]] annotasiyası ilə Metal funksiyası yazır. Funksiya piksel koordinatlarını qəbul edir və rəng qaytarır. CoreImage şeyderi GPU-ya ötürür, burada təsvirin bütün pikselləri üçün paralel olaraq icra olunur. Fərdi filtrlər xüsusi vizual effektlər üçün xüsusilə faydalıdır: qeyri-xətti əyri ilə sepiya, dispersiya bulanıqlaşdırması və ya film dənəsinin imitasiyası.
#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 aralıq nəticələrin keşini avtomatik idarə edir. Eyni filtr zənciri müxtəlif təsvirlərə tətbiq edilərsə, CoreImage kompilyasiya olunmuş şeyderləri təkrar istifadə edə bilər. Maksimum performans üçün hər kadr üçün CIContext yaratmaqdan çəkinin — bir kontekstdən istifadə edin və filtrin giriş parametrlərini yenidən qurun.
CIDetector — Vision və ya Core ML istifadə etmədən təsvirdə semantik obyektlərin aşkarlanması üçün CoreImage alt sistemidir. CIDetector dörd növ deteksiyanı dəstəkləyir: üz (CIDetectorTypeFace), mətn (CIDetectorTypeText), QR kodlar (CIDetectorTypeQRCode) və düzbucaqlılar (CIDetectorTypeRectangle). Detektor NEON təlimatları üçün optimallaşdırma ilə CPU-da işləyir ki, bu da güclü GPU olmayan cihazlarda sabit sürəti təmin edir.
Üz detektoru CIDetectorTypeFace üz sərhədlərinin koordinatları, gözlərin və ağzın mövqeyi ilə CIFaceFeature massivi qaytarır. iOS 12-dən etibarən CIDetector həmçinin təbəssümü (hasSmile) və sol/sağ gözün vəziyyətini (leftEyeClosed, rightEyeClosed) müəyyən edir. Deteksiya dəqiqliyi əksər AR və foto proqramları üçün kifayətdir, lakin kritik ssenarilər üçün Apple Vision.framework-i tövsiyə edir.
CIDetectorTypeRectangle təsvirdə düzbucaqlı sahələri — sənədləri, vizit kartlarını, cihaz ekranlarını tapır. Detektor düzbucaqlının konturunu təşkil edən dörd nöqtə ilə CIRectangleFeature qaytarır. WWDC 2024-ə görə, düzbucaqlı detektoru Vision ilə eyni neyron şəbəkə arxitekturasından istifadə edir, lakin daha az yaddaş istehlakı ilə. Bu, onu real vaxt rejimində kadr axınının emalı üçün, məsələn, sənəd skaneri proqramlarında üstünlük təşkil edir.
Praktik nümunələr CoreImage-in dərk edilməsini möhkəmləndirməyə kömək edəcək. İki tipik ssenarini nəzərdən keçirək: fotoya rəng filtrinin tətbiqi və çərçivə çəkməklə üz deteksiyası.
CISepiaTone filtrinin əsas nümunəsi, rəngli təsviri sepiya tonlarına çevirir. Filtr 0 (orijinal) ilə 1 (maksimum effekt) arasında inputIntensity parametrini qəbul edir. Tənbəl qiymətləndirməyə diqqət yetirin: filter.outputImage tərəfindən qaytarılan CIImage pikselləri ehtiva etmir — render yalnız context.createCGImage çağırışı zamanı baş verir.
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!)
Növbəti nümunə təsvirdə üzləri tapmaq və hər tapılan üzün ətrafında düzbucaqlı çəkmək üçün CIDetector istifadə edir. CIFaceFeature təsvir sistemində koordinatları ehtiva edir (başlanğıc aşağı sol küncdə), buna görə UIKit-də çəkmə zamanı affine transform vasitəsilə koordinatların çevrilməsi tələb olunur.
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("Şəxs gülümsəyir")
}
}
Son nümunə üç filtrdən ibarət zənciri nümayiş etdirir: rəng korreksiyası, vinyetləşdirmə və faktura əlavə edilməsi. Diqqət yetirin ki, birinci filtrin outputImage-i aralıq render olmadan ikinciyə inputImage kimi ötürülür. createCGImage çağırışı zamanı CoreImage hər üç əməliyyatı bir GPU keçidində birləşdirir.
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)
Tez-tez verilən suallar
CoreImage GPU-da işləyir və piksel əməliyyatları (filtrlər, rəng korreksiyası) üçün optimallaşdırılmışdır, Core Graphics isə vektor çəkmə və 2D kontekstləri üçün CPU kitabxanasıdır. CoreImage təsvirlərin kütləvi emalı üçün daha sürətli, Core Graphics interfeysin addım-addım çəkilməsi üçün daha dəqiqdir.
Bəli — CoreImage AVPlayerItemVideoOutput və ya AVCaptureOutput vasitəsilə ayrı-ayrı video kadrlarının emalını dəstəkləyir. Axın emalı üçün AVVideoComposition with CIFilter istifadə edin ki, bu da CPU və GPU arasında kadrların kopyalanması olmadan effektlər tətbiq etməyə imkan verir.
CoreImage defolt olaraq sRGB (kCGColorSpaceSRGB) iş rəng məkanında işləyir. CIContext yaradarkən alternativ məkan — HDR üçün extended linear sRGB və ya geniş gamutlu displeylər üçün Display P3 təyin edilə bilər.
Zəncirdə filtrlərin sayında məhdudiyyət yoxdur, lakin hər 5–7 ardıcıl filtr əlavə GPU keçidi yaradır. 10-dan çox filtr üçün zənciri qruplara bölmək və şeyder registrlərinin limitini aşmamaq üçün aralıq nəticələri render etmək tövsiyə olunur.
Bəli — CIDetector iOS 5.0 və daha yuxarı versiyaları olan bütün cihazlarda NEON təlimatlarından istifadə edərək CPU-da işləyir. Deteksiya dəqiqliyi bütün cihazlarda eynidir, lakin Apple A12+ çiplərində neyron şəbəkələrin aparat sürətləndirilməsi səbəbindən sürət daha yüksəkdir.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun