Werken met kleur in Core Graphics is gebouwd rond twee onderling verbonden entiteiten — CGColor en CGColorSpace. CGColor vertegenwoordigt een specifieke kleur met componenten, en CGColorSpace definieert het interpretatiemodel van deze componenten. Volgens Apple Documentation (2026) ondersteunt Core Graphics meer dan 20 standaard kleurruimten, waaronder sRGB, Generic Gray en Generic CMYK. Het begrijpen van het verschil tussen CGColor en CGColorSpace is noodzakelijk voor het correct tekenen van afbeeldingen op iOS en macOS.
Belangrijkste punten
CGColor — is een fundamenteel Core Graphics-object dat een kleur vertegenwoordigt. In de CGColor-structuur worden numerieke waarden van kleurcomponenten en een verwijzing naar CGColorSpace opgeslagen — de kleurruimte waarin deze componenten worden geïnterpreteerd. Zonder koppeling aan een kleurruimte hebben numerieke waarden van componenten geen betekenis: de waarde (1.0, 0.0, 0.0) in RGB is rood, maar in CMYK is het cyaan (Cyan).
CGColorSpace — is een object dat het kleurmodel en het bereik van weer te geven waarden (gamut) definieert. De kleurruimte stelt regels vast waarmee numerieke componenten worden omgezet in zichtbare kleur op een specifiek uitvoerapparaat. Core Graphics ondersteunt zowel standaard ICC-geprofileerde ruimten als aangepaste ruimten die via CGColorSpace zijn gemaakt met aangepaste conversietabellen.
De architectuur van scheiding tussen kleur en kleurruimte — een belangrijk kenmerk van Core Graphics dat het onderscheidt van API's waar kleur wordt opgeslagen als een eenvoudige reeks getallen. Deze aanpak stelt Core Graphics in staat hardware-onafhankelijk kleurbeheer uit te voeren: hetzelfde CGColor-object kan correct worden weergegeven op verschillende schermen dankzij automatische conversie van componenten via het CGColorSpace-profiel.
Core Graphics implementeert kleur via een model gebaseerd op ICC-profielen (International Color Consortium). Elke CGColorSpace bevat een verwijzing naar een ICC-profiel — een gestandaardiseerde beschrijving van hoe kleurcomponenten worden omgezet in CIE XYZ — een hardware-onafhankelijke kleurruimte. Dit stelt Core Graphics in staat automatische colorimetrische compensatie uit te voeren tussen verschillende schermen.
Bij het maken van CGColor via de functie CGColorCreate worden componenten uit de doorgegeven array vastgelegd en gekoppeld aan de opgegeven CGColorSpace. Core Graphics kopieert de componenten naar een interne representatie en creëert een associatie met de kleurruimte. Hierna is de kleur klaar voor gebruik in elke grafische bewerking — vulling, omtrek, verloop, schaduw.
Op macOS wordt kleurbeheer uitgevoerd via het ColorSync-framework, geïntegreerd in Core Graphics. ColorSync volgt de kalibratie van het scherm en converteert automatisch componenten van de bronkleurruimte naar de ruimte van het doelapparaat. Op iOS wordt kleurbeheer geïmplementeerd via Quartz Core met ondersteuning voor breed kleurbereik (Display P3), vanaf iPhone 7.
CGColorSpace ondersteunt vier basiskleurmodellen: RGB (DeviceRGB, sRGB, Display P3), Gray (DeviceGray), CMYK (DeviceCMYK) en Lab. Elk model bepaalt het aantal en de betekenis van kleurcomponenten. RGB gebruikt drie kanalen — rood, groen, blauw; Gray — één helderheidskanaal; CMYK — vier kanalen voor afdrukken; Lab — drie kanalen: helderheid en twee kleurverschilcomponenten.
| Kleurmodel | Componenten | Toepassing | CGColorSpace-type |
|---|---|---|---|
| RGB | Red, Green, Blue | Schermen, graphics voor iOS/macOS | kCGColorSpaceSRGB |
| Gray | White (één kanaal) | Zwart-wit afbeeldingen, schaduwen | kCGColorSpaceGenericGray |
| CMYK | Cyan, Magenta, Yellow, Black | Drukwerk, PDF | kCGColorSpaceGenericCMYK |
| Display P3 | R, G, B (breed bereik) | Moderne iOS-apparaten | kCGColorSpaceDisplayP3 |
DeviceRGB — is de meest voorkomende standaardkleurruimte van Core Graphics. Het gebruikt het kleurbereik van een standaard LCD-scherm zonder ICC-profilering. Bij het maken van een grafische context van UIView of NSView kent Core Graphics automatisch DeviceRGB toe als standaardkleurruimte. sRGB — een ICC-geprofileerde versie met vast bereik en gamma, aanbevolen voor webinhoud.
Display P3 — kleurruimte gebaseerd op de DCI-P3-standaard, gebruikt in moderne iOS-apparaten met schermen met een breed kleurbereik. Het dekt ongeveer 25% meer zichtbare kleuren dan sRGB, vooral in de groene en rode delen van het spectrum. Voor het werken met Display P3 op iOS wordt de constante kCGColorSpaceDisplayP3 gebruikt, beschikbaar sinds iOS 9.3.
CGColor wordt gemaakt via de functie CGColorCreate, die een CGColorSpace en een array van componenten van het type CGFloat accepteert. Het aantal componenten is afhankelijk van het kleurmodel: voor Gray — 1, voor RGB — 3, voor CMYK — 4. Na het maken is CGColor een onveranderlijk (immutable) object — de componenten kunnen niet worden gewijzigd, alleen een nieuwe kleur kan worden gemaakt.
Core Graphics biedt ook de functies CGColorCreateGenericRGB, CGColorCreateGenericGray en CGColorCreateGenericCMYK voor het maken van kleuren in standaard (generic) kleurruimten. Deze functies vereenvoudigen de code door de noodzaak weg te nemen om expliciet CGColorSpace te maken. Bovendien zijn in Quartz 2D constanten voor basiskleuren gedefinieerd: kCGColorWhite, kCGColorBlack, kCGColorClear.
Bij het maken van een kleur is de volgorde van het opgeven van componenten belangrijk — deze moet strikt overeenkomen met de kanaalvolgorde die is gedefinieerd door het kleurruimtemodel. RGB: rood (0.0–1.0), groen, blauw, alfa (0.0–1.0). Gray: helderheid, alfa. CMYK: cyaan, magenta, geel, zwart, alfa. Het overtreden van de componentenvolgorde leidt tot onjuiste kleurweergave zonder compilatiefout.
Het alfakanaal — de vierde component (of tweede voor Gray) die de transparantie van de kleur regelt. Waarde 1.0 komt overeen met volledige ondoorzichtigheid, 0.0 — volledige transparantie. Het alfakanaal in CGColor is optioneel: de functie CGColorGetAlpha retourneert de huidige alfawaarde, die standaard 1.0 is bij het maken via basisfuncties. Bij het mengen van kleuren gebruikt Core Graphics alfacomposiet volgens de regel Porter-Duff Source Over.
CGColorSpace wordt gemaakt via factory-functies van Core Graphics: CGColorSpaceCreateDeviceRGB, CGColorSpaceCreateDeviceGray, CGColorSpaceCreateDeviceCMYK of CGColorSpaceCreateWithName voor benoemde ruimten (sRGB, Display P3, Generic Gray). Het CGColorSpace-object is onveranderlijk en thread-safe — hetzelfde object kan in meerdere grafische contexten worden gebruikt.
Core Graphics biedt verschillende vooraf gedefinieerde kleurruimten via benoemde constanten: kCGColorSpaceSRGB, kCGColorSpaceDisplayP3, kCGColorSpaceGenericGrayGamma2_2. Deze constanten worden doorgegeven aan CGColorSpaceCreateWithName. Voor iOS-apparaten met een breed kleurbereik wordt aanbevolen Display P3 te gebruiken, omdat sRGB mogelijk niet volledig gebruik maakt van de mogelijkheden van het scherm.
ICC-profielen — zijn gestandaardiseerde bestanden die de kleurkenmerken van een apparaat beschrijven. Core Graphics maakt het mogelijk CGColorSpace te maken op basis van een willekeurig ICC-profiel via CGColorSpaceCreateWithICCProfile. Dit wordt gebruikt in professionele toepassingen voor fotoprint en prepress, waar nauwkeurige overeenstemming met een specifieke printer of monitor vereist is.
Core Graphics voert conversie tussen kleurruimten automatisch uit tijdens het tekenen via de functie CGContextSetFillColorWithColor of CGContextSetStrokeColorWithColor. Als de kleurruimte van de grafische context verschilt van de kleurruimte van de doorgegeven CGColor, voert Quartz 2D de conversie uit met behulp van ICC-profielen van beide ruimten.
Voor expliciete kleurconversie wordt CGColorCreateCopyByMatchingToColorSpace gebruikt — de functie maakt een nieuwe CGColor waarvan de componenten zijn herberekend van de bronruimte naar de doelruimte. Volgens Apple Technical Note TN2313 (2024) worden bij conversie van Display P3 naar sRGB kleuren buiten het sRGB-bereik afgeknipt, wat leidt tot verlies van verzadiging. Dit is vooral merkbaar bij heldergroene en rode tinten.
ColorSync op macOS zorgt voor systeemkleurbeheer op het niveau van de grafische stack. Als de applicatie geen expliciete kleurruimte opgeeft, gebruikt Core Graphics de schermruimte verkregen van ColorSync. Dit garandeert dat kleuren er hetzelfde uitzien op verschillende monitoren, zelfs als ze verschillende kleurprofielen gebruiken.
Laten we praktische voorbeelden bekijken van het maken en gebruiken van CGColor en CGColorSpace in een iOS-applicatie. De code is geschreven in Swift met gebruik van Core Graphics-functies.
Dit voorbeeld toont het maken van een rode kleur in drie verschillende kleurruimten. Ondanks dezelfde RGB-componenten zal de kleur er anders uitzien, afhankelijk van het kleurbereik van CGColorSpace.
import CoreGraphics
// Kleur maken in DeviceRGB
let rgbSpace = CGColorSpaceCreateDeviceRGB()
let redColor = CGColorCreate(rgbSpace, [1.0, 0.0, 0.0, 1.0])
// Kleur maken in Display P3
let p3Space = CGColorSpaceCreateWithName(kCGColorSpaceDisplayP3)
let p3RedColor = CGColorCreate(p3Space, [1.0, 0.0, 0.0, 1.0])
// Grijze kleur maken
let graySpace = CGColorSpaceCreateDeviceGray()
let grayColor = CGColorCreate(graySpace, [0.5, 1.0])
In het voorbeeld wordt helder groene kleur geconverteerd van Display P3 naar sRGB. Bij een dergelijke conversie worden kleuren buiten het sRGB-bereik aangepast, wat de tint kan veranderen.
let p3Space = CGColorSpaceCreateWithName(kCGColorSpaceDisplayP3)
let sRGBSpace = CGColorSpaceCreateWithName(kCGColorSpaceSRGB)
// Helder groen in Display P3 (buiten sRGB-bereik)
let p3Green = CGColorCreate(p3Space, [0.0, 1.0, 0.0, 1.0])
// Converteren naar sRGB
let srgbGreen = CGColorCreateCopyByMatchingToColorSpace(
sRGBSpace, p3Green, kCGRenderingIntentDefault
)
Dit voorbeeld demonstreert het tekenen van een gevulde cirkel met behulp van CGColor in een aangepaste UIView. De methode draw haalt de huidige grafische context UIGraphicsGetCurrentContext op, waarin de vulkleur wordt ingesteld.
class ColorView: UIView {
override func draw(rect: CGRect) {
guard let ctx = UIGraphicsGetCurrentContext()
else { return }
let rgbSpace = CGColorSpaceCreateDeviceRGB()
let blueColor = CGColorCreate(
rgbSpace,
[0.2, 0.4, 1.0, 1.0]
)
ctx.setFillColor(blueColor)
ctx.fillEllipse(in: CGRect(x: 50, y: 50,
width: 200, height: 200))
}
}
Veelgestelde vragen
CGColor — is een laag-niveau representatie van kleur uit Core Graphics, gebruikt in C-stijl API. UIColor — is een hoog-niveau wrapper van UIKit die intern CGColor opslaat en ondersteuning toevoegt voor verschillen in donkere modus (traitCollection). UIColor kan worden geconverteerd naar CGColor via de eigenschap .cgColor.
De kleurruimte bepaalt hoe numerieke componenten worden geïnterpreteerd als zichtbare kleur. Dezelfde reeks getallen (1.0, 0.0, 0.0) betekent rood in RGB, maar cyaan in CMYK. Zonder CGColorSpace kan Core Graphics de kleur niet correct weergeven op een specifiek apparaat met zijn unieke schermkenmerken.
Op iOS wordt de grafische context van UIView standaard gemaakt met de kleurruimte DeviceRGB. Op apparaten met een breed kleurbereik-scherm (iPad Pro 9,7 inch en nieuwer, iPhone 7 en nieuwer) is ook Display P3 beschikbaar, dat 25% meer kleuren ondersteunt dan standaard sRGB.
Nee, CGColor is een onveranderlijk (immutable) object. Om een kleur met andere componenten te krijgen, moet een nieuwe CGColor worden gemaakt via CGColorCreate. Dit is in overeenstemming met het ontwerp van Core Graphics, waar de meeste objecten onveranderlijk zijn om thread-veiligheid en voorspelbaarheid van tekenen te garanderen.
Gebruik voor conversie CGColorCreateCopyByMatchingToColorSpace met de doel-CMYK-ruimte. Core Graphics voert de conversie uit via ICC-profielen, rekening houdend met de renderintent. Kies kCGRenderingIntentRelativeColorimetric voor afdrukken of kCGRenderingIntentPerceptual voor fotorealistische afbeeldingen.
Samenvatting
CGColorCreateCopyByMatchingToColorSpaceWe ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook