CoreImage, renk düzeltme, bulanıklaştırma, doku kaplama ve algılama için düzinelerce yerleşik CIFilter sağlayan, Apple’ın gerçek zamanlı görüntü ve video işleme framework’üdür. Apple Dokümentasyonu’na göre CoreImage, iOS cihazlarda yüksek performanslı piksel işleme için GPU kullanır. Framework, CIImage’i değiştirilemez bir görüntü nesnesi ve kalite kaybı olmadan efektleri birleştirmek için filtre zincirleri olarak destekler.
Önemli Noktalar
CoreImage, ilk olarak macOS 10.4 Tiger’da tanıtılan ve iOS 5.0’a taşınan, Apple’ın raster görüntü ve video işleme framework’üdür. Core Graphics veya UIKit’in aksine CoreImage, piksel shader seviyesinde çalışır ve paralel hesaplamalar için GPU kullanır. Bu, bulanıklaştırma, renk düzeltme, morfing gibi karmaşık efektlerin megapiksel çözünürlükteki görüntülere milisaniyeler içinde uygulanmasını sağlar.
CoreImage mimarisi, tembel değerlendirme (lazy evaluation) kavramı üzerine inşa edilmiştir: CIFilter, CIContext’te oluşturulana kadar işlem yapmaz. Geliştirici, birden çok CIFilter’dan oluşan bir zincir kurar, bir filtrenin çıkışını diğerinin girişine bağlar ve yalnızca render çağrısı tam GPU hattını başlatır. Bu, grafik kartından geçiş sayısını en aza indirir ve performansı korur.
CoreImage geniş renk gamını (P3, sRGB, doğrusal sRGB), HDR görüntüleri ve 16 bit ile 32 bit piksel formatlarında çalışmayı destekler. Neural Engine’e sahip cihazlarda CoreImage, akıllı işleme için GPU shader’larını Core ML ile birleştirebilir — örneğin, iOS 17’deki Fotoğraflar uygulamasında uygulandığı gibi makine öğrenimine dayalı otomatik renk düzeltme.
Üç ana sınıf CoreImage’ın çekirdeğini oluşturur: CIImage (veri), CIFilter (işlem) ve CIContext (yürütme ortamı). Her sınıf, hattın kendi aşamasından sorumludur ve sorumlulukları karıştırmaz.
CIImage, bir görüntüyü tanımlayan ancak doğrudan piksel verisi içermeyen hafif bir nesnedir. UIImage, CGImage, Metal dokusu, GL dokusu veya diskteki bir dosyadan oluşturulabilir. CIImage değiştirilemez — herhangi bir filtre uygulaması, orijinali değiştirmeden yeni bir CIImage oluşturur. Bu, adımlar arasında veri kopyalamadan dönüşüm zincirleri oluşturmayı sağlar.
Önemli bir özellik: CIImage, oluşturulana kadar ekran çözünürlüğüne veya renk uzayına bağlı değildir. Aynı CIImage, ekran için UIImage ve farklı parametrelerle yazdırma için TIFF dosyasına dönüştürülebilir — CoreImage, işlemeyi hedef bağlama otomatik olarak uyarlar.
CIFilter, efektleri uygulamak için ana sınıftır. Her CIFilter, giriş parametreleri (inputImage, inputIntensity, inputRadius vb.) ve bir çıkış görüntüsü olan bir shader programıdır. Apple, kategorilere göre gruplandırılmış 200’den fazla yerleşik CIFilter sağlar: CICategoryColorEffect (renk düzeltme), CICategoryBlur (bulanıklaştırma), CICategoryStylize (stilizasyon), CICategoryGeometryAdjust (geometrik dönüşümler).
Özel bir CIFilter oluşturmak için geliştirici, her pikseli bağımsız olarak işleyen Metal Shading Language’de bir parça shader’ı (CIKernel) yazar. Derlemeden sonra shader, CIFilter alt sınıfı olarak kaydedilir ve Apple’ın yerleşik filtreleriyle birlikte zincirlerde kullanılabilir.
| Kategori | Filtre Örneği | Amaç |
|---|---|---|
| ColorEffect | CIColorControls | Parlaklık, kontrast, doygunluk |
| Blur | CIGaussianBlur | Ayarlanabilir yarıçaplı Gauss bulanıklığı |
| Stylize | CIPixellate | Belirtilen ölçekte pikselleştirme |
| GeometryAdjust | CIAffineTransform | Affine matris ile döndürme, ölçekleme, öteleme |
| Composite | CISourceOverCompositing | Alfa kanalı ile görüntü birleştirme |
CIContext, GPU kaynak tahsisi, shader derleme ve tamponlamayı yöneten ağır bir nesnedir. CIContext oluşturmak pahalı bir işlemdir, bu nedenle Apple, uygulama yaşam döngüsü boyunca bir kez oluşturulmasını ve yeniden kullanılmasını önerir. Bağlam, belirli bir GPU’ya (Metal, OpenGL) veya CPU’ya bağlıdır ve çıkış görüntüsünün renk uzayını belirler.
CIFilter kütüphanesi sürekli genişlemektedir: iOS 17, HDR işleme ve makine öğrenimi için yeni filtreler eklemiştir. Tüm yerleşik filtreler Apple Geliştirici Dokümentasyonu’nda belgelenmiştir ve kategorilere veya adlara göre aranabilir. Cihazda mevcut filtreleri keşfetmek için CIFilter.filterNames(inCategory:) kullanın.
CoreImage’ın ana yeteneği, birden çok CIFilter’ı bir zincirde birleştirmektir. Bir filtrenin çıkışı, inputImage parametresi aracılığıyla diğerinin girişine beslenir. CoreImage, zinciri oluşturma aşamasında optimize eder: aynı renk uzayında çalışan bitişik filtreler tek bir GPU geçişinde (kernel füzyonu) birleştirilir. Bu, geliştirici müdahalesi olmadan performans artışı sağlar.
Özel efekt oluşturmak için geliştirici, [[kernel]] ek açıklamasıyla bir Metal işlevi yazar. İşlev, piksel koordinatlarını alır ve bir renk döndürür. CoreImage, shader’ı GPU’ya gönderir ve burada görüntünün tüm pikselleri için paralel olarak yürütülür. Özel filtreler, doğrusal olmayan eğriyle sepya, dağılım bulanıklığı veya film greni simülasyonu gibi benzersiz görsel efektler için özellikle kullanışlıdır.
#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, ara sonuçların önbelleğini otomatik olarak yönetir. Aynı filtre zinciri farklı görüntülere uygulanırsa, CoreImage derlenmiş shader’ları yeniden kullanabilir. Maksimum performans için her kare için CIContext oluşturmaktan kaçının — tek bir bağlam kullanın ve filtrenin giriş parametrelerini sıfırlayın.
CIDetector, Vision veya Core ML kullanmadan bir görüntüde anlamsal nesneleri algılamak için CoreImage alt sistemidir. CIDetector dört tür algılamayı destekler: yüzler (CIDetectorTypeFace), metin (CIDetectorTypeText), QR kodları (CIDetectorTypeQRCode) ve dikdörtgenler (CIDetectorTypeRectangle). Algılayıcı, NEON talimatları için optimize edilmiş CPU’da çalışır ve güçlü GPU’su olmayan cihazlarda sabit hız sağlar.
Yüz algılayıcı CIDetectorTypeFace, yüz sınır koordinatları, göz ve ağız konumlarıyla birlikte bir CIFaceFeature dizisi döndürür. iOS 12’den itibaren CIDetector ayrıca gülümsemeyi (hasSmile) ve sol/sağ göz konumunu (leftEyeClosed, rightEyeClosed) da algılar. Algılama doğruluğu çoğu AR ve fotoğraf uygulaması için yeterlidir, ancak kritik senaryolarda Apple Vision.framework’ü önerir.
CIDetectorTypeRectangle, bir görüntüde dikdörtgen alanları bulur — belgeler, kartvizitler, cihaz ekranları. Algılayıcı, dikdörtgen konturunu oluşturan dört noktayla CIRectangleFeature döndürür. WWDC 2024’e göre dikdörtgen algılayıcısı, Vision ile aynı sinir ağı mimarisini kullanır ancak daha düşük bellek tüketimiyle. Bu, onu örneğin belge tarayıcı uygulamalarında gerçek zamanlı kare akışı işleme için tercih edilir kılar.
Pratik örnekler CoreImage anlayışını pekiştirmeye yardımcı olacaktır. İki tipik senaryoyu inceleyelim: bir fotoğrafa renk filtresi uygulamak ve sınırlayıcı kutu çizimiyle yüz algılama.
CISepiaTone filtresinin temel bir örneği, renkli bir görüntüyü sepya tonlarına dönüştürür. Filtre, inputIntensity parametresini 0 (orijinal) ile 1 (maksimum efekt) arasında kabul eder. Tembel değerlendirmeye dikkat edin: filter.outputImage tarafından döndürülen CIImage piksel içermez — oluşturma yalnızca context.createCGImage çağrıldığında gerçekleşir.
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!)
Aşağıdaki örnek, bir görüntüde yüzleri bulmak ve algılanan her yüzün etrafına bir dikdörtgen çizmek için CIDetector kullanır. CIFaceFeature, görüntü koordinat sisteminde (kaynak sol alt köşede) koordinatlar içerir, bu nedenle UIKit üzerinde çizim yaparken affine dönüşüm yoluyla koordinat dönüşümü gerekir.
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("Kişi gülümsüyor")
}
}
Son örnek, üç filtreden oluşan bir zinciri gösterir: renk düzeltme, karartma ve doku kaplama. İlk filtrenin outputImage’inin, ara oluşturma olmadan ikinciye inputImage olarak iletildiğini unutmayın. createCGImage çağrıldığında CoreImage, üç işlemi de tek bir GPU geçişinde birleştirir.
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)
Sıkça Sorulan Sorular
CoreImage GPU’da çalışır ve piksel işlemleri (filtreler, renk düzeltme) için optimize edilmiştir, oysa Core Graphics vektörel çizim ve 2D bağlamlar için bir CPU kütüphanesidir. CoreImage toplu görüntü işlemede daha hızlıdır, Core Graphics adım adım arayüz çiziminde daha hassastır.
Evet — CoreImage, AVPlayerItemVideoOutput veya AVCaptureOutput aracılığıyla bireysel video karelerinin işlenmesini destekler. Akış işleme için CIFilter ile AVVideoComposition kullanın, bu da CPU ve GPU arasında kare kopyalamadan efektler uygulamaya olanak tanır.
CoreImage varsayılan olarak sRGB çalışma renk uzayında (kCGColorSpaceSRGB) çalışır. CIContext oluştururken alternatif bir uzay belirtebilirsiniz — HDR için genişletilmiş doğrusal sRGB veya geniş gamlı ekranlar için Display P3.
Bir zincirdeki filtre sayısında sınır yoktur, ancak her 5–7 ardışık filtre ek bir GPU geçişi oluşturur. 10’dan fazla filtre için, shader kayıt sınırını aşmamak için zinciri gruplara ayırmanız ve ara sonuçları oluşturmanız önerilir.
Evet — CIDetector, iOS 5.0 ve üzeri tüm cihazlarda NEON talimatlarını kullanarak CPU’da çalışır. Algılama doğruluğu tüm cihazlarda aynıdır, ancak Apple A12+ yongalarında donanım hızlandırmalı sinir ağları sayesinde hız daha yüksektir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun