CGColor en CGColorSpace: wat zijn het, kleurmodellen en hoe ze te beheren

Auteur: IT Sectr Gepubliceerd: 2026-07-21 Leestijd: 9 min

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 — object dat kleurcomponenten en een verwijzing naar de kleurruimte opslaat
  • CGColorSpace — object dat het interpretatiemodel van kleurcomponenten (RGB, Gray, CMYK) definieert
  • Elke CGColor is aan precies één CGColorSpace gekoppeld — kleur zonder ruimte wordt als onvolledig beschouwd
  • Core Graphics biedt ICC-gebaseerd kleurbeheer voor nauwkeurige kleurweergave tussen apparaten
  • Conversie tussen kleurruimten wordt uitgevoerd via ColorSync op macOS en via Quartz Core op iOS

Wat zijn CGColor en CGColorSpace?

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.

Hoe kleuren werken in Core Graphics

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.

Levenscyclus van een CGColor-object

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.

Kleurbeheer via ColorSync

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.

Belangrijkste kleurmodellen in CGColorSpace

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.

KleurmodelComponentenToepassingCGColorSpace-type
RGBRed, Green, BlueSchermen, graphics voor iOS/macOSkCGColorSpaceSRGB
GrayWhite (één kanaal)Zwart-wit afbeeldingen, schaduwenkCGColorSpaceGenericGray
CMYKCyan, Magenta, Yellow, BlackDrukwerk, PDFkCGColorSpaceGenericCMYK
Display P3R, G, B (breed bereik)Moderne iOS-apparatenkCGColorSpaceDisplayP3

DeviceRGB en sRGB

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 — breed kleurbereik

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 maken en beheren

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.

Alfakanaal en transparantie

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.

Werken met CGColorSpace

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.

Basis CGColorSpace verkrijgen

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 en aangepaste CGColorSpace

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.

Conversie tussen kleurruimten

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.

Codevoorbeelden in Swift

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.

CGColor maken met verschillende kleurruimten

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.

swift
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])

Kleur converteren tussen kleurruimten

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.

swift
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
)

CGColor gebruiken in een grafische context

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.

swift
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

Wat is het verschil tussen CGColor en UIColor?

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.

Waarom moet ik de kleurruimte specificeren voor 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.

Welke kleurruimte wordt standaard gebruikt in iOS?

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.

Kunnen de componenten van CGColor na het maken worden gewijzigd?

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.

Hoe converteer ik CGColor van RGB naar CMYK?

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

  • CGColor — onveranderlijk kleurobject met componenten en verwijzing naar kleurruimte
  • CGColorSpace — definieert het kleurmodel (RGB, Gray, CMYK) en het bereik van weer te geven kleuren
  • DeviceRGB — standaardkleurruimte voor grafische context van iOS en macOS
  • Display P3 — breedspectrumruimte voor moderne Apple-apparaten met 25% meer dekking dan sRGB
  • ICC-profielen zorgen voor nauwkeurige kleurconversie tussen verschillende apparaten via ColorSync
  • Alfakanaal — optionele transparantiecomponent die deelneemt aan Porter-Duff-composiet
  • Conversie tussen ruimten gebeurt automatisch tijdens het tekenen of expliciet via CGColorCreateCopyByMatchingToColorSpace

We 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.

Bespreek het project

Lees ook