CoreImage ist ein Apple-Framework für Echtzeit-Bild- und Videoverarbeitung, das Dutzende integrierter CIFilter für Farbkorrektur, Unschärfe, Texturüberlagerungen und Erkennung bereitstellt. Laut Apple-Dokumentation verwendet CoreImage die GPU für hochleistungsfähige Pixelverarbeitung auf iOS-Geräten. Das Framework unterstützt CIImage als unveränderliches Bildobjekt und Filterketten zur Komposition von Effekten ohne Qualitätsverlust.
Wichtige Punkte
CoreImage ist ein Apple-Framework für Rasterbild- und Videoverarbeitung, erstmals eingeführt in macOS 10.4 Tiger und portiert auf iOS 5.0. Im Gegensatz zu Core Graphics oder UIKit arbeitet CoreImage auf Pixelshader-Ebene und nutzt die GPU für parallele Berechnungen. Dies ermöglicht die Anwendung komplexer Effekte — Unschärfe, Farbkorrektur, Morphing — auf Bilder mit Megapixel-Auflösung in Millisekunden.
Die Architektur von CoreImage basiert auf dem Konzept der verzögerten Auswertung (Lazy Evaluation): CIFilter führt keine Verarbeitung bis zum Rendern im CIContext durch. Der Entwickler baut eine Kette aus mehreren CIFiltern auf, verbindet die Ausgabe eines Filters mit der Eingabe eines anderen, und erst der render-Aufruf startet die vollständige GPU-Pipeline. Dies minimiert die Anzahl der Durchläufe durch die Grafikkarte und erhält die Leistung.
CoreImage unterstützt breiten Farbraum (P3, sRGB, lineares sRGB), HDR-Bilder und die Arbeit mit 16-Bit- und 32-Bit-Pixelformaten. Auf Geräten mit Neural Engine kann CoreImage GPU-Shader mit Core ML für intelligente Verarbeitung kombinieren — zum Beispiel automatische Farbkorrektur basierend auf maschinellem Lernen, wie in der Fotos-App auf iOS 17 implementiert.
Drei Hauptklassen bilden den Kern von CoreImage: CIImage (Daten), CIFilter (Operation) und CIContext (Ausführungsumgebung). Jede Klasse ist für ihre eigene Pipeline-Phase verantwortlich und vermischt keine Zuständigkeiten.
CIImage ist ein leichtgewichtiges Objekt, das ein Bild beschreibt, aber nicht direkt Pixeldaten enthält. Es kann aus UIImage, CGImage, Metal-Textur, GL-Textur oder einer Datei auf der Festplatte erstellt werden. CIImage ist unveränderlich — jede Filteranwendung erzeugt ein neues CIImage, ohne das Original zu verändern. Dies ermöglicht den Aufbau von Transformationsketten ohne Datenkopien zwischen den Schritten.
Eine wichtige Eigenschaft: CIImage ist bis zum Rendern nicht an Bildschirmauflösung oder Farbraum gebunden. Dasselbe CIImage kann in ein UIImage für den Bildschirm und in eine TIFF-Datei für den Druck mit unterschiedlichen Parametern gerendert werden — CoreImage passt die Verarbeitung automatisch an den Zielkontext an.
CIFilter ist die Hauptklasse zum Anwenden von Effekten. Jeder CIFilter ist ein Shader-Programm mit Eingabeparametern (inputImage, inputIntensity, inputRadius, usw.) und einem Ausgabebild. Apple liefert über 200 integrierte CIFilter, gruppiert nach Kategorien: CICategoryColorEffect (Farbkorrektur), CICategoryBlur (Unschärfe), CICategoryStylize (Stilisierung), CICategoryGeometryAdjust (geometrische Transformationen).
Um einen benutzerdefinierten CIFilter zu erstellen, schreibt der Entwickler einen Metal-Shader (CIKernel) — einen Fragment-Shader in der Metal Shading Language, der jedes Pixel unabhängig verarbeitet. Nach der Kompilierung wird der Shader als Unterklasse von CIFilter registriert und kann in Ketten zusammen mit Apples integrierten Filtern verwendet werden.
| Kategorie | Beispielfilter | Zweck |
|---|---|---|
| ColorEffect | CIColorControls | Helligkeit, Kontrast, Sättigung |
| Blur | CIGaussianBlur | Gaußsche Unschärfe mit einstellbarem Radius |
| Stylize | CIPixellate | Pixelisierung mit festgelegtem Maßstab |
| GeometryAdjust | CIAffineTransform | Drehung, Skalierung, Verschiebung über affine Matrix |
| Composite | CISourceOverCompositing | Bildkomposition mit Alphakanal |
CIContext ist ein schwergewichtiges Objekt, das die GPU-Ressourcenzuweisung, Shader-Kompilierung und Pufferung verwaltet. Das Erstellen eines CIContext ist eine teure Operation, daher empfiehlt Apple, ihn einmal pro Anwendungslebenszyklus zu erstellen und wiederzuverwenden. Der Kontext ist an eine bestimmte GPU (Metal, OpenGL) oder CPU gebunden und bestimmt den Farbraum des Ausgabebildes.
Die CIFilter-Bibliothek erweitert sich ständig: iOS 17 fügte neue Filter für HDR-Verarbeitung und maschinelles Lernen hinzu. Alle integrierten Filter sind in der Apple Developer Documentation dokumentiert und können nach Kategorien oder Namen durchsucht werden. Um verfügbare Filter auf dem Gerät zu entdecken, verwenden Sie CIFilter.filterNames(inCategory:).
Die Hauptfähigkeit von CoreImage ist die Komposition mehrerer CIFilter zu einer Kette. Die Ausgabe eines Filters wird über den Parameter inputImage der Eingabe eines anderen zugeführt. CoreImage optimiert die Kette in der Rendering-Phase: benachbarte Filter, die im selben Farbraum arbeiten, werden zu einem einzigen GPU-Durchlauf (Kernel-Fusion) kombiniert. Dies bringt einen Leistungsgewinn ohne Eingriff des Entwicklers.
Um einen benutzerdefinierten Effekt zu erstellen, schreibt der Entwickler eine Metal-Funktion mit der [[kernel]]-Annotation. Die Funktion empfängt Pixelkoordinaten und gibt eine Farbe zurück. CoreImage übergibt den Shader an die GPU, wo er parallel für alle Pixel des Bildes ausgeführt wird. Benutzerdefinierte Filter sind besonders nützlich für einzigartige visuelle Effekte: Sepia mit nichtlinearer Kurve, Dispersionsunschärfe oder Filmkornsimulation.
#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 verwaltet automatisch den Cache für Zwischenergebnisse. Wenn dieselbe Filterkette auf verschiedene Bilder angewendet wird, kann CoreImage kompilierte Shader wiederverwenden. Für maximale Leistung vermeiden Sie es, einen CIContext pro Frame zu erstellen — verwenden Sie einen Kontext und setzen Sie die Eingabeparameter des Filters zurück.
CIDetector ist ein Subsystem von CoreImage zur Erkennung semantischer Objekte in einem Bild ohne Verwendung von Vision oder Core ML. CIDetector unterstützt vier Erkennungsarten: Gesichter (CIDetectorTypeFace), Text (CIDetectorTypeText), QR-Codes (CIDetectorTypeQRCode) und Rechtecke (CIDetectorTypeRectangle). Der Detektor arbeitet auf der CPU mit Optimierung für NEON-Instruktionen, was eine stabile Geschwindigkeit auf Geräten ohne leistungsstarke GPU gewährleistet.
Der Gesichtsdetektor CIDetectorTypeFace gibt ein Array von CIFaceFeature mit Gesichtsgrenzkoordinaten, Augen- und Mundpositionen zurück. Seit iOS 12 erkennt CIDetector auch Lächeln (hasSmile) und die Position des linken/rechten Auges (leftEyeClosed, rightEyeClosed). Die Erkennungsgenauigkeit ist für die meisten AR- und Fotoanwendungen ausreichend, aber für kritische Szenarien empfiehlt Apple Vision.framework.
CIDetectorTypeRectangle findet rechteckige Bereiche in einem Bild — Dokumente, Visitenkarten, Gerätebildschirme. Der Detektor gibt CIRectangleFeature mit vier Punkten zurück, die die Rechteckkontur bilden. Laut WWDC 2024 verwendet der Rechteckdetektor dieselbe neuronale Netzwerkarchitektur wie Vision, jedoch mit geringerem Speicherverbrauch. Dies macht ihn bevorzugt für die Echtzeit-Frame-Stream-Verarbeitung, zum Beispiel in Dokumentenscanner-Anwendungen.
Praktische Beispiele helfen, das Verständnis von CoreImage zu festigen. Betrachten wir zwei typische Szenarien: Anwenden eines Farbfilters auf ein Foto und Gesichtserkennung mit Zeichnen eines Begrenzungsrahmens.
Ein grundlegendes Beispiel des CISepiaTone-Filters, der ein Farbbild in Sepiatöne umwandelt. Der Filter akzeptiert den Parameter inputIntensity von 0 (Original) bis 1 (maximaler Effekt). Beachten Sie die verzögerte Auswertung: Das von filter.outputImage zurückgegebene CIImage enthält keine Pixel — das Rendering erfolgt nur, wenn context.createCGImage aufgerufen wird.
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!)
Das folgende Beispiel verwendet CIDetector, um Gesichter in einem Bild zu finden und ein Rechteck um jedes erkannte Gesicht zu zeichnen. CIFaceFeature enthält Koordinaten im Bildkoordinatensystem (Ursprung unten links). Beim Zeichnen auf UIKit ist daher eine Koordinatentransformation über affine Transformation erforderlich.
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("Die Person lächelt")
}
}
Das letzte Beispiel demonstriert eine Kette von drei Filtern: Farbkorrektur, Vignettierung und Texturüberlagerung. Beachten Sie, dass das outputImage des ersten Filters als inputImage an den zweiten übergeben wird — ohne Zwischenrendering. Wenn createCGImage aufgerufen wird, kombiniert CoreImage alle drei Operationen in einem einzigen GPU-Durchlauf.
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)
Häufig gestellte Fragen
CoreImage läuft auf der GPU und ist für Pixeloperationen (Filter, Farbkorrektur) optimiert, während Core Graphics eine CPU-Bibliothek für Vektorzeichnungen und 2D-Kontexte ist. CoreImage ist schneller für die Stapelbildverarbeitung, Core Graphics genauer für die schrittweise Schnittstellenzeichnung.
Ja — CoreImage unterstützt die Verarbeitung einzelner Videoframes über AVPlayerItemVideoOutput oder AVCaptureOutput. Für die Streaming-Verarbeitung verwenden Sie AVVideoComposition mit CIFilter, was das Anwenden von Effekten ohne Kopieren von Frames zwischen CPU und GPU ermöglicht.
CoreImage arbeitet standardmäßig im sRGB-Arbeitsfarbraum (kCGColorSpaceSRGB). Beim Erstellen eines CIContext kann ein alternativer Raum angegeben werden — erweitertes lineares sRGB für HDR oder Display P3 für Wide-Gamut-Displays.
Es gibt keine Begrenzung der Anzahl der Filter in einer Kette, aber alle 5–7 aufeinanderfolgende Filter erzeugen einen zusätzlichen GPU-Durchlauf. Bei mehr als 10 Filtern wird empfohlen, die Kette in Gruppen aufzuteilen und Zwischenergebnisse zu rendern, um die Shader-Registergrenze nicht zu überschreiten.
Ja — CIDetector arbeitet auf der CPU mit NEON-Instruktionen auf allen Geräten mit iOS 5.0 und höher. Die Erkennungsgenauigkeit ist auf allen Geräten gleich, aber die Geschwindigkeit ist auf Apple A12+-Chips aufgrund der hardwarebeschleunigten neuronalen Netze höher.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch