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 — ä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.
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.
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.
På 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.
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ärgmodell | Komponenter | Användning | CGColorSpace-typ |
|---|---|---|---|
| RGB | Red, Green, Blue | Skärmar, grafik för iOS/macOS | kCGColorSpaceSRGB |
| Gray | White (en kanal) | Svartvit grafik, skuggor | kCGColorSpaceGenericGray |
| CMYK | Cyan, Magenta, Yellow, Black | Tryckprodukter, PDF | kCGColorSpaceGenericCMYK |
| Display P3 | R, G, B (brett omfång) | Moderna iOS-enheter | kCGColorSpaceDisplayP3 |
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 — 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.
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 — 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.
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.
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 — ä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.
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.
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.
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.
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])
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.
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
)
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.
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
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.
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.
På 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.
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.
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
CGColorCreateCopyByMatchingToColorSpaceVi 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.
Läs också