CoreImage — bu Apple-ning tasvirlar va videolarni real vaqtda qayta ishlash freymvorki bo‘lib, ranglarni tuzatish, xiralashtirish, tekstura qo‘shish va aniqlash uchun o‘nlab o‘rnatilgan CIFilter-larni taqdim etadi. Apple Documentation ma’lumotlariga ko‘ra, CoreImage iOS qurilmalarida yuqori unumdorlik bilan piksel qayta ishlash uchun GPU dan foydalanadi. Freymvork CIImage ni o‘zgarmas tasvir obyekti va sifat yo‘qotilmasdan effektlar kompozitsiyasi uchun filtr zanjirlarini qo‘llab-quvvatlaydi.
Asosiy ma’lumotlar
CoreImage bu Apple-ning rastrli tasvirlar va videolarni qayta ishlash freymvorki bo‘lib, birinchi marta macOS 10.4 Tiger da taqdim etilgan va iOS 5.0 ga ko‘chirilgan. Core Graphics yoki UIKit dan farqli o‘laroq, CoreImage piksel shaderlari darajasida ishlaydi va parallel hisoblashlar uchun GPU dan foydalanadi. Bu megapiksel o‘lchamidagi tasvirlarga millisekundlarda murakkab effektlar — xiralashtirish, rang tuzatish, morfing qo‘llash imkonini beradi.
CoreImage arxitekturasi dangasa hisoblash (lazy evaluation) kontseptsiyasiga asoslangan: CIFilter CIContext da renderlash vaqtigacha qayta ishlashni bajarmaydi. Dasturchi bir nechta CIFilter dan zanjir quradi, bir filtrning chiqishini ikkinchisining kirishiga ulaydi va faqat render chaqiruvi to‘liq GPU quvurini ishga tushiradi. Bu grafik karta orqali o‘tishlar sonini minimallashtiradi va unumdorlikni saqlaydi.
CoreImage keng rang gamutini (P3, sRGB, chiziqli sRGB), HDR tasvirlarini va 16-bitli va 32-bitli piksel formatlari bilan ishlashni qo‘llab-quvvatlaydi. Neural Engine ga ega qurilmalarda CoreImage GPU shaderlarini Core ML bilan birlashtirib, aqlli qayta ishlashni amalga oshirishi mumkin — masalan, iOS 17 dagi Foto ilovasida qo‘llanilganidek, mashina o‘rganishiga asoslangan avtomatik rang tuzatish.
Uchta asosiy sinf CoreImage yadrosini tashkil qiladi: CIImage (ma’lumotlar), CIFilter (operatsiya) va CIContext (ijro muhiti). Har bir sinf quvurning o‘z fazasi uchun javobgardir va mas’uliyatlarni aralashtirmaydi.
CIImage bu tasvirni tavsiflovchi, ammo bevosita piksel ma’lumotlarini o‘z ichiga olmaydigan yengil obyektdir. UIImage, CGImage, Metal teksturasi, GL teksturasi yoki diskdagi fayldan yaratilishi mumkin. CIImage o‘zgarmasdir — filtrning har bir qo‘llanilishi asl nusxani o‘zgartirmasdan yangi CIImage yaratadi. Bu bosqichlar orasida ma’lumotlarni nusxalashsiz transformatsiya zanjirlarini qurish imkonini beradi.
Muhim xususiyat: CIImage renderlash vaqtigacha ekran o‘lchamiga yoki rang fazosiga bog‘liq emas. Xuddi shu CIImage ni turli parametrlar bilan ekran uchun UIImage ga va chop etish uchun TIFF fayliga renderlash mumkin — CoreImage avtomatik ravishda qayta ishlashni maqsadli kontekstga moslashtiradi.
CIFilter effektlarni qo‘llash uchun asosiy sinfdir. Har bir CIFilter kirish parametrlari (inputImage, inputIntensity, inputRadius va h.k.) va bitta chiqish tasviri bilan shader dasturidir. Apple 200 dan ortiq o‘rnatilgan CIFilter ni yetkazib beradi, ular kategoriyalarga guruhlangan: CICategoryColorEffect (rang tuzatish), CICategoryBlur (xiralashtirish), CICategoryStylize (stilizatsiya), CICategoryGeometryAdjust (geometrik transformatsiyalar).
Maxsus CIFilter yaratish uchun dasturchi Metal shaderini (CIKernel) yozadi — Metal Shading Language da har bir pikselni mustaqil qayta ishlaydigan fragment shaderi. Kompilyatsiyadan so‘ng shader CIFilter ning kichik sinfi sifatida ro‘yxatga olinadi va Apple-ning o‘rnatilgan filtrlari bilan bir qatorda zanjirlarda ishlatilishi mumkin.
| Kategoriya | Filtr namunasi | Maqsad |
|---|---|---|
| ColorEffect | CIColorControls | Yorqinlik, kontrast, to‘yinganlik |
| Blur | CIGaussianBlur | Sozlanadigan radius bilan Gauss xiralashtirishi |
| Stylize | CIPixellate | Belgilangan masshtab bilan tasvirni piksellashtirish |
| GeometryAdjust | CIAffineTransform | Affin matritsasi orqali aylantirish, masshtablash, siljitish |
| Composite | CISourceOverCompositing | Alfa kanali bilan tasvirlarni ustma-ust qo‘yish |
CIContext — GPU resurslarini ajratish, shaderlarni kompilyatsiya qilish va buferlashtirishni boshqaradigan og‘ir obyektdir. CIContext yaratish qimmat operatsiyadir, shuning uchun Apple uni ilovaning butun hayotiy sikli uchun bir marta yaratish va qayta ishlatishni tavsiya qiladi. Kontekst ma’lum bir GPU (Metal, OpenGL) yoki CPU ga bog‘langan va chiqish tasvirining rang fazosini belgilaydi.
CIFilter kutubxonasi doimiy ravishda kengayib bormoqda: iOS 17 HDR qayta ishlash va mashina o‘rganishi uchun yangi filtrlarni qo‘shdi. Barcha o‘rnatilgan filtrlar Apple Developer Documentation da hujjatlashtirilgan, ularni kategoriyalar yoki nomlar bo‘yicha qidirish mumkin. Qurilmada mavjud filtrlarni aniqlash uchun CIFilter.filterNames(inCategory:) dan foydalaning.
Asosiy imkoniyat CoreImage — bir nechta CIFilter ni zanjirda kompozitsiya qilish. Bir filtrning chiqishi inputImage parametri orqali keyingisining kirishiga beriladi. CoreImage renderlash bosqichida zanjirni optimallashtiradi: bir rang fazosida ishlaydigan qo‘shni filtrlari bitta GPU o‘tishida (kernel fusion) birlashtiriladi. Bu dasturchining aralashuvisiz unumdorlikni oshirishni ta’minlaydi.
O‘z effektini yaratish uchun dasturchi [[kernel]] annotatsiyasi bilan Metal funksiyasini yozadi. Funksiya piksel koordinatalarini qabul qiladi va rangni qaytaradi. CoreImage shaderni GPU ga yuboradi, u yerda tasvirning barcha piksellari uchun parallel ravishda bajariladi. Maxsus filtrlar, ayniqsa, noyob vizual effektlar uchun foydalidir: chiziqli bo‘lmagan egri chiziq bilan sepya, dispersiya xiralashtirishi yoki film donasini taqlid qilish.
#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 oraliq natijalar keshlarini avtomatik boshqaradi. Agar bir xil filtr zanjiri turli tasvirlarga qo‘llanilsa, CoreImage kompilyatsiya qilingan shaderlarni qayta ishlatishi mumkin. Maksimal unumdorlik uchun har bir kadr uchun CIContext yaratishdan saqlaning — bitta kontekstdan foydalaning va filtrning kirish parametrlarini qayta o‘rnating.
CIDetector — Vision yoki Core ML dan foydalanmasdan tasvirda semantik obyektlarni aniqlash uchun CoreImage quyi tizimi. CIDetector to‘rt turdagi deteksiyani qo‘llab-quvvatlaydi: yuz (CIDetectorTypeFace), matn (CIDetectorTypeText), QR kodlar (CIDetectorTypeQRCode) va to‘rtburchaklar (CIDetectorTypeRectangle). Detektor NEON ko‘rsatmalari uchun optimallashtirilgan CPU da ishlaydi, bu kuchli GPU ga ega bo‘lmagan qurilmalarda barqaror tezlikni ta’minlaydi.
Yuz detektori CIDetectorTypeFace yuz chegaralari, ko‘zlar va og‘iz holati koordinatalari bilan CIFaceFeature massivini qaytaradi. iOS 12 dan boshlab CIDetector shuningdek tabassumni (hasSmile) va chap/o‘ng ko‘z holatini (leftEyeClosed, rightEyeClosed) aniqlaydi. Deteksiya aniqligi ko‘pgina AR va foto ilovalari uchun yetarli, ammo muhim stsenariylar uchun Apple Vision.framework ni tavsiya qiladi.
CIDetectorTypeRectangle tasvirda to‘rtburchak maydonlarni — hujjatlar, tashrif qog‘ozlari, qurilma ekranlarini topadi. Detektor to‘rtburchak konturini tashkil etuvchi to‘rt nuqta bilan CIRectangleFeature qaytaradi. WWDC 2024 ga ko‘ra, to‘rtburchak detektori Vision bilan bir xil neyron tarmoq arxitekturasidan foydalanadi, ammo kamroq xotira iste’moli bilan. Bu uni real vaqt rejimida kadrlar oqimini qayta ishlash uchun, masalan, hujjat skaneri ilovalarida afzal qiladi.
Amaliy misollar CoreImage tushunchasini mustahkamlashga yordam beradi. Ikkita odatiy stsenariyni ko‘rib chiqamiz: fotosuratga rang filtrini qo‘llash va ramka chizish bilan yuz deteksiyasi.
CISepiaTone filtrining asosiy misoli, rangli tasvirni sepya tonlariga aylantiradi. Filtr inputIntensity parametrini 0 (asl) dan 1 (maksimal effekt) gacha qabul qiladi. Dangasa baholashga e’tibor bering: filter.outputImage tomonidan qaytarilgan CIImage piksellarni o‘z ichiga olmaydi — renderlash faqat context.createCGImage chaqirilganda sodir bo‘ladi.
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!)
Keyingi misol tasvirda yuzlarni topish va har bir topilgan yuz atrofida to‘rtburchak chizish uchun CIDetector dan foydalanadi. CIFaceFeature tasvir tizimidagi koordinatalarni o‘z ichiga oladi (boshlanish pastki chap burchakda), shuning uchun UIKit da chizishda affine transform orqali koordinatalarni o‘zgartirish talab qilinadi.
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("Shaxs tabassum qilmoqda")
}
}
Yakuniy misol uchta filtrdan iborat zanjirni namoyish etadi: rang tuzatish, vignetka va tekstura qo‘shish. E’tibor bering, birinchi filtrning outputImage si oraliq renderlashsiz ikkinchisiga inputImage sifatida uzatiladi. createCGImage chaqirilganda CoreImage barcha uch operatsiyani bitta GPU o‘tishida birlashtiradi.
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 beriladigan savollar
CoreImage GPU da ishlaydi va piksel operatsiyalari (filtrlar, rang tuzatish) uchun optimallashtirilgan, Core Graphics esa vektor chizish va 2D kontekstlar uchun CPU kutubxonasidir. CoreImage tasvirlarni ommaviy qayta ishlash uchun tezroq, Core Graphics interfeysni bosqichma-bosqich chizish uchun aniqroq.
Ha — CoreImage AVPlayerItemVideoOutput yoki AVCaptureOutput orqali alohida video kadrlarini qayta ishlashni qo‘llab-quvvatlaydi. Oqimli qayta ishlash uchun AVVideoComposition with CIFilter dan foydalaning, bu CPU va GPU o‘rtasida kadrlarni nusxalashsiz effektlarni qo‘llash imkonini beradi.
CoreImage sukut bo‘yicha sRGB (kCGColorSpaceSRGB) ishchi rang fazosida ishlaydi. CIContext yaratishda muqobil fazo — HDR uchun extended linear sRGB yoki keng gamutli displeylar uchun Display P3 belgilanishi mumkin.
Zanjirdagi filtrlar sonida cheklov yo‘q, ammo har 5–7 ketma-ket filtr qo‘shimcha GPU o‘tishini yaratadi. 10 dan ortiq filtrlar uchun zanjirni guruhlarga bo‘lish va shader registrlari chegarasidan oshib ketmaslik uchun oraliq natijalarni renderlash tavsiya etiladi.
Ha — CIDetector iOS 5.0 va undan yuqori versiyali barcha qurilmalarda NEON ko‘rsatmalaridan foydalangan holda CPU da ishlaydi. Deteksiya aniqligi barcha qurilmalarda bir xil, ammo Apple A12+ chiplarida neyron tarmoqlarning apparat tezlashuvi tufayli tezlik yuqoriroq.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.