CGColor och CGColorSpace: vad är det, färgmodeller och hur man hanterar dem

Författare: IT Sectr Publicerad: 2026-07-21 Lästid: 9 min

Arbetet med färg i Core Graphics bygger på två sammanlänkade entiteter — CGColor och CGColorSpace. CGColor representerar en specifik färg med komponenter, och CGColorSpace definierar tolkningsmodellen för dessa komponenter. Enligt Apple Documentation (2026) stöder Core Graphics över 20 standardfärgrymder, inklusive sRGB, Generic Gray och Generic CMYK. Att förstå skillnaden mellan CGColor och CGColorSpace är nödvändigt för korrekt ritning av grafik på iOS och macOS.

Huvudpunkter

  • CGColor — objekt som lagrar färgkomponenter och en referens till färgrymden
  • CGColorSpace — objekt som definierar tolkningsmodellen för färgkomponenter (RGB, Gray, CMYK)
  • Varje CGColor är kopplad till exakt en CGColorSpace — färg utan rymd anses ofullständig
  • Core Graphics tillhandahåller ICC-baserad färghantering för korrekt färgåtergivning mellan enheter
  • Konvertering mellan färgrymder utförs via ColorSync på macOS och via Quartz Core på iOS

Vad är CGColor och CGColorSpace?

CGColor — är ett grundläggande Core Graphics-objekt som representerar en färg. I CGColor-strukturen lagras numeriska värden för färgkomponenter och en referens till CGColorSpace — den färgrymd där dessa komponenter tolkas. Utan koppling till en färgrymd har komponenternas numeriska värden ingen mening: värdet (1.0, 0.0, 0.0) i RGB är rött, men i CMYK är det cyan (Cyan).

CGColorSpace — är ett objekt som definierar färgmodellen och intervallet för representerbara värden (gamut). Färgrymden fastställer reglerna enligt vilka numeriska komponenter omvandlas till synlig färg på en specifik utenhet. Core Graphics stöder både standard ICC-profilerade rymder och anpassade rymder skapade via CGColorSpace med anpassade konverteringstabeller.

Arkitekturen med separation av färg och färgrymd — en nyckelfunktion i Core Graphics som skiljer det från API:er där färg lagras som en enkel uppsättning siffror. Detta tillvägagångssätt gör det möjligt för Core Graphics att utföra hårdvaruoberoende färghantering: samma CGColor-objekt kan visas korrekt på olika skärmar tack vare automatisk konvertering av komponenter via CGColorSpace-profilen.

Hur färger fungerar i Core Graphics

Core Graphics implementerar färg genom en modell baserad på ICC-profiler (International Color Consortium). Varje CGColorSpace innehåller en referens till en ICC-profil — en standardiserad beskrivning av hur färgkomponenter omvandlas till CIE XYZ — en hårdvaruoberoende färgrymd. Detta gör det möjligt för Core Graphics att utföra automatisk kolorimetrisk kompensation mellan olika skärmar.

Livscykel för CGColor-objekt

Vid skapande av CGColor via funktionen CGColorCreate fångas komponenterna från den överförda arrayen och kopplas till den angivna CGColorSpace. Core Graphics kopierar komponenterna till en intern representation och skapar en association med färgrymden. Därefter är färgen redo för användning i vilken grafisk operation som helst — fyllning, kontur, gradient, skugga.

Färghantering via ColorSync

macOS utförs färghantering via ColorSync-ramverket som är integrerat i Core Graphics. ColorSync spårar skärmkalibrering och konverterar automatiskt komponenter från källans färgrymd till målenhetens rymd. På iOS implementeras färghantering via Quartz Core med stöd för brett färgomfång (Display P3), från och med iPhone 7.

Huvudsakliga färgmodeller i CGColorSpace

CGColorSpace stöder fyra grundläggande färgmodeller: RGB (DeviceRGB, sRGB, Display P3), Gray (DeviceGray), CMYK (DeviceCMYK) och Lab. Varje modell bestämmer antalet och betydelsen av färgkomponenter. RGB använder tre kanaler — röd, grön, blå; Gray — en ljusstyrkekanal; CMYK — fyra kanaler för utskrift; Lab — tre kanaler: ljusstyrka och två färgskillnadskomponenter.

FärgmodellKomponenterAnvändningCGColorSpace-typ
RGBRed, Green, BlueSkärmar, grafik för iOS/macOSkCGColorSpaceSRGB
GrayWhite (en kanal)Svartvit grafik, skuggorkCGColorSpaceGenericGray
CMYKCyan, Magenta, Yellow, BlackTryckprodukter, PDFkCGColorSpaceGenericCMYK
Display P3R, G, B (brett omfång)Moderna iOS-enheterkCGColorSpaceDisplayP3

DeviceRGB och sRGB

DeviceRGB — är den vanligaste standardfärgrymden i Core Graphics. Den använder färgomfånget från en standard LCD-skärm utan ICC-profilering. Vid skapande av grafisk kontext för UIView eller NSView tilldelar Core Graphics automatiskt DeviceRGB som standardfärgrymd. sRGB — en ICC-profilerad version med fast omfång och gamma, rekommenderad för webbinnehåll.

Display P3 — brett färgomfång

Display P3 — färgrymd baserad på DCI-P3-standarden, som används i moderna iOS-enheter med bildskärmar med brett färgomfång. Den täcker cirka 25% fler synliga färger än sRGB, särskilt i spektrats gröna och röda områden. För att arbeta med Display P3 på iOS används konstanten kCGColorSpaceDisplayP3, tillgänglig från iOS 9.3.

Skapa och hantera CGColor

CGColor skapas via funktionen CGColorCreate, som tar emot en CGColorSpace och en array av komponenter av typ CGFloat. Antalet komponenter beror på färgmodellen: för Gray — 1, för RGB — 3, för CMYK — 4. Efter skapandet är CGColor ett oföränderligt (immutable) objekt — dess komponenter kan inte ändras, endast en ny färg kan skapas.

Core Graphics tillhandahåller också funktionerna CGColorCreateGenericRGB, CGColorCreateGenericGray och CGColorCreateGenericCMYK för att skapa färger i standard (generiska) färgrymder. Dessa funktioner förenklar koden genom att eliminera behovet av att explicit skapa CGColorSpace. Dessutom definieras i Quartz 2D konstanter för grundfärger: kCGColorWhite, kCGColorBlack, kCGColorClear.

Vid skapande av en färg är ordningen för att ange komponenter viktig — den måste strikt överensstämma med kanalordningen som definieras av färgrymdens modell. RGB: röd (0.0–1.0), grön, blå, alfa (0.0–1.0). Gray: ljusstyrka, alfa. CMYK: cyan, magenta, gul, svart, alfa. Brott mot komponentordningen leder till felaktig färgvisning utan kompileringsfel.

Alfakanal och genomskinlighet

Alfakanal — den fjärde komponenten (eller andra för Gray) som styr färgens genomskinlighet. Värdet 1.0 motsvarar fullständig opacitet, 0.0 — fullständig genomskinlighet. Alfakanalen i CGColor är valfri: funktionen CGColorGetAlpha returnerar det aktuella alfavärdet, som som standard är 1.0 vid skapande via basfunktioner. Vid blandning av färger använder Core Graphics alfa-komposit enligt Porter-Duff Source Over-regeln.

Arbeta med CGColorSpace

CGColorSpace skapas via fabriksfunktioner i Core Graphics: CGColorSpaceCreateDeviceRGB, CGColorSpaceCreateDeviceGray, CGColorSpaceCreateDeviceCMYK eller CGColorSpaceCreateWithName för namngivna rymder (sRGB, Display P3, Generic Gray). CGColorSpace-objektet är oföränderligt och trådsäkert — samma objekt kan användas i flera grafiska kontexter.

Hämta grundläggande CGColorSpace

Core Graphics tillhandahåller flera fördefinierade färgrymder via namngivna konstanter: kCGColorSpaceSRGB, kCGColorSpaceDisplayP3, kCGColorSpaceGenericGrayGamma2_2. Dessa konstanter skickas till CGColorSpaceCreateWithName. För iOS-enheter med brett färgomfång rekommenderas att använda Display P3, eftersom sRGB kanske inte fullt utnyttjar skärmens kapacitet.

ICC-profiler och anpassad CGColorSpace

ICC-profiler — är standardiserade filer som beskriver en enhets färgegenskaper. Core Graphics tillåter att skapa CGColorSpace baserat på en godtycklig ICC-profil via CGColorSpaceCreateWithICCProfile. Detta används i professionella applikationer för fotoutskrift och prepress, där exakt överensstämmelse med en specifik skrivare eller monitor krävs.

Konvertering mellan färgrymder

Core Graphics utför konvertering mellan färgrymder automatiskt vid ritning via funktionen CGContextSetFillColorWithColor eller CGContextSetStrokeColorWithColor. Om färgrymden för den grafiska kontexten skiljer sig från färgrymden för den överförda CGColor, utför Quartz 2D konvertering med hjälp av ICC-profiler från båda rymderna.

För explicit färgkonvertering används CGColorCreateCopyByMatchingToColorSpace — funktionen skapar en ny CGColor vars komponenter är omräknade från källrymden till målrymden. Enligt Apple Technical Note TN2313 (2024) klipps färger utanför sRGB-omfånget vid konvertering från Display P3 till sRGB, vilket leder till förlust av mättnad. Detta är särskilt märkbart på ljusa gröna och röda nyanser.

ColorSync på macOS tillhandahåller systemfärghantering på nivån av den grafiska stacken. Om applikationen inte anger en explicit färgrymd använder Core Graphics skärmrymden som erhålls från ColorSync. Detta garanterar att färger kommer att se likadana ut på olika monitorer, även om de använder olika färgprofiler.

Kodexempel i Swift

Låt oss titta på praktiska exempel på att skapa och använda CGColor och CGColorSpace i en iOS-applikation. Koden är skriven i Swift med användning av Core Graphics-funktioner.

Skapa CGColor med olika färgrymder

Detta exempel visar skapandet av röd färg i tre olika färgrymder. Trots samma RGB-komponenter kommer färgen att se olika ut beroende på CGColorSpace färgomfång.

swift
import CoreGraphics

// Skapa färg i DeviceRGB
let rgbSpace = CGColorSpaceCreateDeviceRGB()
let redColor = CGColorCreate(rgbSpace, [1.0, 0.0, 0.0, 1.0])

// Skapa färg i Display P3
let p3Space = CGColorSpaceCreateWithName(kCGColorSpaceDisplayP3)
let p3RedColor = CGColorCreate(p3Space, [1.0, 0.0, 0.0, 1.0])

// Skapa grå färg
let graySpace = CGColorSpaceCreateDeviceGray()
let grayColor = CGColorCreate(graySpace, [0.5, 1.0])

Konvertering av färg mellan färgrymder

I exemplet utförs konvertering av ljusgrön färg från Display P3 till sRGB. Vid en sådan konvertering kommer färger utanför sRGB-omfånget att anpassas, vilket kan ändra nyansen.

swift
let p3Space = CGColorSpaceCreateWithName(kCGColorSpaceDisplayP3)
let sRGBSpace = CGColorSpaceCreateWithName(kCGColorSpaceSRGB)

// Ljusgrön i Display P3 (utanför sRGB-omfånget)
let p3Green = CGColorCreate(p3Space, [0.0, 1.0, 0.0, 1.0])

// Konvertera till sRGB
let srgbGreen = CGColorCreateCopyByMatchingToColorSpace(
    sRGBSpace, p3Green, kCGRenderingIntentDefault
)

Använda CGColor i grafisk kontext

Detta exempel visar ritning av en fylld cirkel med hjälp av CGColor i en anpassad UIView. Metoden draw hämtar den aktuella grafiska kontexten UIGraphicsGetCurrentContext, i vilken fyllningsfärgen ställs in.

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

Vanliga frågor

Vad är skillnaden mellan CGColor och UIColor?

CGColor — är en lågnivårepresentation av färg från Core Graphics som används i C-stil API. UIColor — är ett högnivåomslag i UIKit som internt lagrar CGColor och lägger till stöd för skillnader i mörkt läge (traitCollection). UIColor kan konverteras till CGColor via egenskapen .cgColor.

Varför måste jag ange färgrymd för CGColor?

Färgrymden bestämmer hur numeriska komponenter tolkas som synlig färg. Samma uppsättning siffror (1.0, 0.0, 0.0) betyder rött i RGB, men cyan i CMYK. Utan CGColorSpace kan Core Graphics inte visa färgen korrekt på en specifik enhet med dess unika skärmegenskaper.

Vilken färgrymd används som standard i iOS?

iOS skapas UIView grafiska kontext som standard med färgrymden DeviceRGB. På enheter med bildskärm med brett färgomfång (iPad Pro 9,7 tum och nyare, iPhone 7 och nyare) är även Display P3 tillgängligt, som stöder 25% fler färger än standard sRGB.

Kan CGColor-komponenter ändras efter skapandet?

Nej, CGColor är ett oföränderligt (immutable) objekt. För att få en färg med andra komponenter måste en ny CGColor skapas via CGColorCreate. Detta överensstämmer med Core Graphics design, där de flesta objekt är oföränderliga för att säkerställa trådsäkerhet och förutsägbarhet vid ritning.

Hur konverterar jag CGColor från RGB till CMYK?

För konvertering, använd CGColorCreateCopyByMatchingToColorSpace med mål-CMYK-rymden. Core Graphics utför konverteringen via ICC-profiler med hänsyn till renderingsintent. Välj kCGRenderingIntentRelativeColorimetric för utskrift eller kCGRenderingIntentPerceptual för fotorealistiska bilder.

Sammanfattning

  • CGColor — oföränderligt färgobjekt med komponenter och referens till färgrymd
  • CGColorSpace — definierar färgmodellen (RGB, Gray, CMYK) och intervallet för representerbara färger
  • DeviceRGB — standardfärgrymd för grafisk kontext för iOS och macOS
  • Display P3 — bredspektrig rymd för moderna Apple-enheter med 25% större täckning än sRGB
  • ICC-profiler säkerställer exakt färgkonvertering mellan olika enheter via ColorSync
  • Alfakanal — valfri genomskinlighetskomponent som deltar i Porter-Duff-komposit
  • Konvertering mellan rymder sker automatiskt vid ritning eller explicit via CGColorCreateCopyByMatchingToColorSpace

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också