Práce s barvou v Core Graphics je postavena na dvou vzájemně propojených entitách — CGColor a CGColorSpace. CGColor představuje konkrétní barvu s komponentami a CGColorSpace definuje model interpretace těchto komponent. Podle Apple Documentation (2026) podporuje Core Graphics více než 20 standardních barevných prostorů, včetně sRGB, Generic Gray a Generic CMYK. Pochopení rozdílu mezi CGColor a CGColorSpace je nezbytné pro správné kreslení grafiky na iOS a macOS.
Hlavní body
CGColor — je základní objekt Core Graphics představující barvu. Ve struktuře CGColor jsou uloženy číselné hodnoty barevných komponent a odkaz na CGColorSpace — barevný prostor, ve kterém jsou tyto komponenty interpretovány. Bez vazby na barevný prostor nemají číselné hodnoty komponent smysl: hodnota (1.0, 0.0, 0.0) v RGB je červená, ale v CMYK je azurová (Cyan).
CGColorSpace — je objekt definující barevný model a rozsah reprezentovatelných hodnot (gamut). Barevný prostor stanovuje pravidla, podle kterých se číselné komponenty přeměňují na viditelnou barvu na konkrétním výstupním zařízení. Core Graphics podporuje jak standardní ICC-profily, tak vlastní prostory vytvořené přes CGColorSpace s vlastními převodními tabulkami.
Architektura oddělení barvy a barevného prostoru — klíčová vlastnost Core Graphics, která ji odlišuje od API, kde je barva uložena jako jednoduchá sada čísel. Tento přístup umožňuje Core Graphics provádět na hardwaru nezávislou správu barev: stejný objekt CGColor může být správně zobrazen na různých obrazovkách díky automatickému převodu komponent přes profil CGColorSpace.
Core Graphics implementuje barvu prostřednictvím modelu založeného na ICC profilech (International Color Consortium). Každý CGColorSpace obsahuje odkaz na ICC profil — standardizovaný popis toho, jak jsou barevné komponenty převáděny na CIE XYZ — hardwarově nezávislý barevný prostor. To umožňuje Core Graphics provádět automatickou kolorimetrickou kompenzaci mezi různými obrazovkami.
Při vytváření CGColor prostřednictvím funkce CGColorCreate dochází k zachycení komponent z předaného pole a jejich svázání s určeným CGColorSpace. Core Graphics zkopíruje komponenty do interní reprezentace a vytvoří asociaci s barevným prostorem. Poté je barva připravena k použití v jakékoli grafické operaci — výplň, obrys, přechod, stín.
Na macOS je správa barev prováděna prostřednictvím frameworku ColorSync integrovaného do Core Graphics. ColorSync sleduje kalibraci obrazovky a automaticky převádí komponenty z barevného prostoru zdroje do prostoru cílového zařízení. Na iOS je správa barev implementována přes Quartz Core s podporou širokého barevného gamutu (Display P3), počínaje iPhone 7.
CGColorSpace podporuje čtyři základní barevné modely: RGB (DeviceRGB, sRGB, Display P3), Gray (DeviceGray), CMYK (DeviceCMYK) a Lab. Každý model určuje počet a význam barevných komponent. RGB používá tři kanály — červený, zelený, modrý; Gray — jeden kanál jasu; CMYK — čtyři kanály pro tisk; Lab — tři kanály: jas a dvě složky barevného rozdílu.
| Barevný model | Komponenty | Použití | Typ CGColorSpace |
|---|---|---|---|
| RGB | Red, Green, Blue | Obrazovky, grafika pro iOS/macOS | kCGColorSpaceSRGB |
| Gray | White (jeden kanál) | Černobílá grafika, stíny | kCGColorSpaceGenericGray |
| CMYK | Cyan, Magenta, Yellow, Black | Tiskařské produkty, PDF | kCGColorSpaceGenericCMYK |
| Display P3 | R, G, B (široký gamut) | Moderní zařízení iOS | kCGColorSpaceDisplayP3 |
DeviceRGB — je nejběžnější výchozí barevný prostor Core Graphics. Používá barevný gamut standardního LCD displeje bez ICC profilování. Při vytváření grafického kontextu UIView nebo NSView automaticky přiřazuje Core Graphics DeviceRGB jako výchozí barevný prostor. sRGB — verze s ICC profilem s pevným gamutem a gama, doporučená pro webový obsah.
Display P3 — barevný prostor založený na standardu DCI-P3, používaný v moderních zařízeních iOS s displeji s širokým barevným gamutem. Pokrývá přibližně o 25 % více viditelných barev než sRGB, zejména v zelené a červené oblasti spektra. Pro práci s Display P3 na iOS se používá konstanta kCGColorSpaceDisplayP3, dostupná od iOS 9.3.
CGColor se vytváří prostřednictvím funkce CGColorCreate, která přijímá CGColorSpace a pole komponent typu CGFloat. Počet komponent závisí na barevném modelu: pro Gray — 1, pro RGB — 3, pro CMYK — 4. Po vytvoření je CGColor neměnný (immutable) objekt — jeho komponenty nelze změnit, lze pouze vytvořit novou barvu.
Core Graphics také poskytuje funkce CGColorCreateGenericRGB, CGColorCreateGenericGray a CGColorCreateGenericCMYK pro vytváření barev ve standardních (generic) barevných prostorech. Tyto funkce zjednodušují kód tím, že odstraňují potřebu explicitně vytvářet CGColorSpace. Kromě toho jsou v Quartz 2D definovány konstanty základních barev: kCGColorWhite, kCGColorBlack, kCGColorClear.
Při vytváření barvy je důležité pořadí zadávání komponent — musí přesně odpovídat pořadí kanálů definovanému modelem barevného prostoru. RGB: červená (0.0–1.0), zelená, modrá, alfa (0.0–1.0). Gray: jas, alfa. CMYK: azurová, purpurová, žlutá, černá, alfa. Porušení pořadí komponent vede k nesprávnému zobrazení barvy bez chyby kompilace.
Alfa kanál — čtvrtá komponenta (nebo druhá pro Gray) řídící průhlednost barvy. Hodnota 1.0 odpovídá úplné neprůhlednosti, 0.0 — úplné průhlednosti. Alfa kanál v CGColor je volitelný: funkce CGColorGetAlpha vrací aktuální hodnotu alfa, která je ve výchozím nastavení 1.0 při vytváření prostřednictvím základních funkcí. Při míchání barev používá Core Graphics alfa kompozit podle pravidla Porter-Duff Source Over.
CGColorSpace se vytváří prostřednictvím továrních funkcí Core Graphics: CGColorSpaceCreateDeviceRGB, CGColorSpaceCreateDeviceGray, CGColorSpaceCreateDeviceCMYK nebo CGColorSpaceCreateWithName pro pojmenované prostory (sRGB, Display P3, Generic Gray). Objekt CGColorSpace je neměnný a thread-safe — stejný objekt lze použít ve více grafických kontextech.
Core Graphics poskytuje několik předdefinovaných barevných prostorů prostřednictvím pojmenovaných konstant: kCGColorSpaceSRGB, kCGColorSpaceDisplayP3, kCGColorSpaceGenericGrayGamma2_2. Tyto konstanty se předávají CGColorSpaceCreateWithName. Pro zařízení iOS s širokým barevným gamutem se doporučuje používat Display P3, protože sRGB nemusí plně využít možnosti displeje.
ICC profily — jsou standardizované soubory popisující barevné charakteristiky zařízení. Core Graphics umožňuje vytvářet CGColorSpace na základě libovolného ICC profilu prostřednictvím CGColorSpaceCreateWithICCProfile. To se používá v profesionálních aplikacích pro tisk fotografií a prepress, kde je vyžadována přesná shoda s konkrétní tiskárnou nebo monitorem.
Core Graphics provádí převod mezi barevnými prostory automaticky při kreslení prostřednictvím funkce CGContextSetFillColorWithColor nebo CGContextSetStrokeColorWithColor. Pokud se barevný prostor grafického kontextu liší od barevného prostoru předaného CGColor, provede Quartz 2D konverzi pomocí ICC profilů obou prostorů.
Pro explicitní převod barvy se používá CGColorCreateCopyByMatchingToColorSpace — funkce vytvoří nový CGColor, jehož komponenty jsou přepočítány z původního prostoru do cílového. Podle Apple Technical Note TN2313 (2024) jsou při převodu z Display P3 do sRGB barvy mimo gamut sRGB oříznuty, což vede ke ztrátě sytosti. To je patrné zejména u jasně zelených a červených odstínů.
ColorSync na macOS zajišťuje systémovou správu barev na úrovni grafického zásobníku. Pokud aplikace neurčuje explicitní barevný prostor, používá Core Graphics prostor obrazovky získaný z ColorSync. To zaručuje, že barvy budou vypadat stejně na různých monitorech, i když používají různé barevné profily.
Podívejme se na praktické příklady vytváření a používání CGColor a CGColorSpace v iOS aplikaci. Kód je napsán ve Swift s použitím funkcí Core Graphics.
Tento příklad ukazuje vytvoření červené barvy ve třech různých barevných prostorech. Navzdory stejným RGB komponentám bude barva vypadat jinak v závislosti na barevném gamutu CGColorSpace.
import CoreGraphics
// Vytvoření barvy v DeviceRGB
let rgbSpace = CGColorSpaceCreateDeviceRGB()
let redColor = CGColorCreate(rgbSpace, [1.0, 0.0, 0.0, 1.0])
// Vytvoření barvy v Display P3
let p3Space = CGColorSpaceCreateWithName(kCGColorSpaceDisplayP3)
let p3RedColor = CGColorCreate(p3Space, [1.0, 0.0, 0.0, 1.0])
// Vytvoření šedé barvy
let graySpace = CGColorSpaceCreateDeviceGray()
let grayColor = CGColorCreate(graySpace, [0.5, 1.0])
V příkladu se provádí konverze jasně zelené barvy z Display P3 do sRGB. Při takovém převodu budou barvy mimo gamut sRGB přizpůsobeny, což může změnit odstín.
let p3Space = CGColorSpaceCreateWithName(kCGColorSpaceDisplayP3)
let sRGBSpace = CGColorSpaceCreateWithName(kCGColorSpaceSRGB)
// Jasně zelená v Display P3 (mimo gamut sRGB)
let p3Green = CGColorCreate(p3Space, [0.0, 1.0, 0.0, 1.0])
// Převod na sRGB
let srgbGreen = CGColorCreateCopyByMatchingToColorSpace(
sRGBSpace, p3Green, kCGRenderingIntentDefault
)
Tento příklad ukazuje kreslení vyplněného kruhu pomocí CGColor ve vlastním UIView. Metoda draw získává aktuální grafický kontext UIGraphicsGetCurrentContext, ve kterém se nastavuje barva výplně.
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))
}
}
Často kladené otázky
CGColor — je nízkoúrovňová reprezentace barvy z Core Graphics používaná v API ve stylu C. UIColor — je vysokoúrovňový obal UIKit, který interně ukládá CGColor a přidává podporu pro rozdíly v tmavém režimu (traitCollection). UIColor lze převést na CGColor pomocí vlastnosti .cgColor.
Barevný prostor určuje, jak jsou číselné komponenty interpretovány jako viditelná barva. Stejná sada čísel (1.0, 0.0, 0.0) znamená v RGB červenou, ale v CMYK azurovou. Bez CGColorSpace nemůže Core Graphics správně zobrazit barvu na konkrétním zařízení s jeho jedinečnými charakteristikami displeje.
Na iOS je grafický kontext UIView ve výchozím nastavení vytvořen s barevným prostorem DeviceRGB. Na zařízeních s displejem s širokým barevným gamutem (iPad Pro 9,7 palce a novější, iPhone 7 a novější) je k dispozici také Display P3, které podporuje o 25 % více barev než standardní sRGB.
Ne, CGColor je neměnný (immutable) objekt. Pro získání barvy s jinými komponentami je třeba vytvořit nový CGColor prostřednictvím CGColorCreate. To je v souladu s návrhem Core Graphics, kde je většina objektů neměnná pro zajištění thread-safety a předvídatelnosti kreslení.
Pro převod použijte CGColorCreateCopyByMatchingToColorSpace s cílovým CMYK prostorem. Core Graphics provede konverzi přes ICC profily s ohledem na rendering intent. Zvolte kCGRenderingIntentRelativeColorimetric pro tisk nebo kCGRenderingIntentPerceptual pro fotorealistické obrázky.
Shrnutí
CGColorCreateCopyByMatchingToColorSpaceVyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také