Praca z kolorem w Core Graphics opiera się na dwóch powiązanych ze sobą bytach — CGColor i CGColorSpace. CGColor reprezentuje konkretny kolor z komponentami, a CGColorSpace określa model interpretacji tych komponentów. Według Apple Documentation (2026), Core Graphics obsługuje ponad 20 standardowych przestrzeni kolorów, w tym sRGB, Generic Gray i Generic CMYK. Zrozumienie różnicy między CGColor a CGColorSpace jest niezbędne do prawidłowego rysowania grafiki na iOS i macOS.
Najważniejsze
CGColor — to fundamentalny obiekt Core Graphics reprezentujący kolor. W strukturze CGColor przechowywane są numeryczne wartości komponentów koloru oraz odwołanie do CGColorSpace — przestrzeni kolorów, w której te komponenty są interpretowane. Bez powiązania z przestrzenią kolorów numeryczne wartości komponentów nie mają sensu: wartość (1.0, 0.0, 0.0) w RGB to czerwony, a w CMYK to cyjan (Cyan).
CGColorSpace — to obiekt określający model koloru i zakres reprezentowalnych wartości (gamut). Przestrzeń kolorów definiuje zasady, według których numeryczne komponenty przekształcane są w widzialny kolor na konkretnym urządzeniu wyjściowym. Core Graphics obsługuje zarówno standardowe przestrzenie z profilowaniem ICC, jak i niestandardowe przestrzenie tworzone przez CGColorSpace z niestandardowymi tabelami konwersji.
Architektura rozdzielenia koloru i przestrzeni kolorów — kluczowa cecha Core Graphics odróżniająca ją od API, gdzie kolor jest przechowywany jako prosty zestaw liczb. Takie podejście pozwala Core Graphics na niezależne od sprzętu zarządzanie kolorem: ten sam obiekt CGColor może być poprawnie wyświetlony na różnych ekranach dzięki automatycznej konwersji komponentów przez profil CGColorSpace.
Core Graphics implementuje kolor poprzez model oparty na profilach ICC (International Color Consortium). Każdy CGColorSpace zawiera odwołanie do profilu ICC — standaryzowanego opisu tego, jak komponenty kolorów są przekształcane na CIE XYZ — niezależną od sprzętu przestrzeń kolorów. Pozwala to Core Graphics na automatyczną kolorymetryczną kompensację między różnymi ekranami.
Podczas tworzenia CGColor przez funkcję CGColorCreate następuje przechwycenie komponentów z przekazanej tablicy i powiązanie z określonym CGColorSpace. Core Graphics kopiuje komponenty do wewnętrznej reprezentacji i tworzy asocjację z przestrzenią kolorów. Następnie kolor jest gotowy do użycia w dowolnej operacji graficznej — wypełnienie, obrys, gradient, cień.
Na macOS zarządzanie kolorem odbywa się przez framework ColorSync zintegrowany z Core Graphics. ColorSync śledzi kalibrację ekranu i automatycznie przekształca komponenty z przestrzeni kolorów źródła do przestrzeni urządzenia docelowego. Na iOS zarządzanie kolorem jest zaimplementowane przez Quartz Core z obsługą szerokiego gamutu kolorów (Display P3), począwszy od iPhone 7.
CGColorSpace obsługuje cztery podstawowe modele kolorów: RGB (DeviceRGB, sRGB, Display P3), Gray (DeviceGray), CMYK (DeviceCMYK) i Lab. Każdy model określa liczbę i znaczenie komponentów kolorów. RGB używa trzech kanałów — czerwonego, zielonego, niebieskiego; Gray — jednego kanału jasności; CMYK — czterech kanałów do druku; Lab — trzech kanałów: jasności i dwóch składowych różnicy kolorów.
| Model koloru | Komponenty | Zastosowanie | Typ CGColorSpace |
|---|---|---|---|
| RGB | Red, Green, Blue | Ekrany, grafika dla iOS/macOS | kCGColorSpaceSRGB |
| Gray | White (jeden kanał) | Grafika czarno-biała, cienie | kCGColorSpaceGenericGray |
| CMYK | Cyan, Magenta, Yellow, Black | Produkcja drukarska, PDF | kCGColorSpaceGenericCMYK |
| Display P3 | R, G, B (szeroki gamut) | Nowoczesne urządzenia iOS | kCGColorSpaceDisplayP3 |
DeviceRGB — to najczęściej używana domyślna przestrzeń kolorów Core Graphics. Wykorzystuje gamut kolorów standardowego wyświetlacza LCD bez profilowania ICC. Podczas tworzenia kontekstu graficznego UIView lub NSView, Core Graphics automatycznie przypisuje DeviceRGB jako domyślną przestrzeń kolorów. sRGB — wersja z profilowaniem ICC o stałym gamucie i gamie, zalecana do treści internetowych.
Display P3 — przestrzeń kolorów oparta na standardzie DCI-P3, używana w nowoczesnych urządzeniach iOS z wyświetlaczami o szerokim gamucie. Obejmuje około 25% więcej widzialnych kolorów niż sRGB, szczególnie w zielonym i czerwonym obszarze spektrum. Do pracy z Display P3 na iOS używana jest stała kCGColorSpaceDisplayP3, dostępna od iOS 9.3.
CGColor jest tworzony przez funkcję CGColorCreate, która przyjmuje CGColorSpace i tablicę komponentów typu CGFloat. Liczba komponentów zależy od modelu koloru: dla Gray — 1, dla RGB — 3, dla CMYK — 4. Po utworzeniu CGColor jest niezmiennym (immutable) obiektem — nie można zmienić jego komponentów, można tylko utworzyć nowy kolor.
Core Graphics udostępnia również funkcje CGColorCreateGenericRGB, CGColorCreateGenericGray i CGColorCreateGenericCMYK do tworzenia kolorów w standardowych (generic) przestrzeniach kolorów. Te funkcje upraszczają kod, eliminując konieczność jawnego tworzenia CGColorSpace. Ponadto w Quartz 2D zdefiniowane są stałe podstawowych kolorów: kCGColorWhite, kCGColorBlack, kCGColorClear.
Podczas tworzenia koloru ważna jest kolejność podawania komponentów — musi ona ściśle odpowiadać kolejności kanałów określonej przez model przestrzeni kolorów. RGB: czerwony (0.0–1.0), zielony, niebieski, alfa (0.0–1.0). Gray: jasność, alfa. CMYK: cyjan, magenta, żółty, czarny, alfa. Naruszenie kolejności komponentów prowadzi do nieprawidłowego wyświetlania koloru bez błędu kompilacji.
Kanał alfa — czwarty komponent (lub drugi dla Gray), zarządzający przezroczystością koloru. Wartość 1.0 odpowiada całkowitej nieprzezroczystości, 0.0 — całkowitej przezroczystości. Kanał alfa w CGColor jest opcjonalny: funkcja CGColorGetAlpha zwraca bieżącą wartość alfa, która domyślnie wynosi 1.0 przy tworzeniu przez podstawowe funkcje. Podczas mieszania kolorów Core Graphics używa kompozycji alfa według reguły Porter-Duff Source Over.
CGColorSpace jest tworzony przez fabryczne funkcje Core Graphics: CGColorSpaceCreateDeviceRGB, CGColorSpaceCreateDeviceGray, CGColorSpaceCreateDeviceCMYK lub CGColorSpaceCreateWithName dla nazwanych przestrzeni (sRGB, Display P3, Generic Gray). Obiekt CGColorSpace jest niezmienny i bezpieczny wątkowo — ten sam obiekt może być używany w wielu kontekstach graficznych.
Core Graphics udostępnia kilka predefiniowanych przestrzeni kolorów przez nazwane stałe: kCGColorSpaceSRGB, kCGColorSpaceDisplayP3, kCGColorSpaceGenericGrayGamma2_2. Te stałe są przekazywane do CGColorSpaceCreateWithName. Dla urządzeń iOS z szerokim gamutem kolorów zaleca się używanie Display P3, ponieważ sRGB może nie w pełni wykorzystać możliwości wyświetlacza.
Profile ICC — to standaryzowane pliki opisujące charakterystyki kolorystyczne urządzenia. Core Graphics pozwala tworzyć CGColorSpace na podstawie dowolnego profilu ICC przez CGColorSpaceCreateWithICCProfile. Jest to używane w profesjonalnych aplikacjach do druku fotograficznego i prepressu, gdzie wymagana jest dokładna zgodność z określoną drukarką lub monitorem.
Core Graphics wykonuje konwersję między przestrzeniami kolorów automatycznie podczas rysowania przez funkcję CGContextSetFillColorWithColor lub CGContextSetStrokeColorWithColor. Jeśli przestrzeń kolorów kontekstu graficznego różni się od przestrzeni kolorów przekazanego CGColor, Quartz 2D wykonuje konwersję z użyciem profili ICC obu przestrzeni.
Do jawnej konwersji koloru używana jest CGColorCreateCopyByMatchingToColorSpace — funkcja tworzy nowy CGColor, którego komponenty są przeliczone z oryginalnej przestrzeni do docelowej. Według Apple Technical Note TN2313 (2024), podczas konwersji z Display P3 na sRGB kolory poza gamutem sRGB są przycinane, co prowadzi do utraty nasycenia. Jest to szczególnie widoczne w przypadku jasnych zielonych i czerwonych odcieni.
ColorSync na macOS zapewnia systemowe zarządzanie kolorem na poziomie stosu graficznego. Jeśli aplikacja nie określa jawnej przestrzeni kolorów, Core Graphics używa przestrzeni wyświetlacza uzyskanej z ColorSync. Gwarantuje to, że kolory będą wyglądać tak samo na różnych monitorach, nawet jeśli używają one różnych profili kolorów.
Rozważmy praktyczne przykłady tworzenia i używania CGColor i CGColorSpace w aplikacji iOS. Kod napisany jest w Swift z użyciem funkcji Core Graphics.
W tym przykładzie pokazano tworzenie czerwonego koloru w trzech różnych przestrzeniach kolorów. Pomimo identycznych komponentów RGB, kolor będzie wyglądał inaczej w zależności od gamutu kolorów CGColorSpace.
import CoreGraphics
// Tworzenie koloru w DeviceRGB
let rgbSpace = CGColorSpaceCreateDeviceRGB()
let redColor = CGColorCreate(rgbSpace, [1.0, 0.0, 0.0, 1.0])
// Tworzenie koloru w Display P3
let p3Space = CGColorSpaceCreateWithName(kCGColorSpaceDisplayP3)
let p3RedColor = CGColorCreate(p3Space, [1.0, 0.0, 0.0, 1.0])
// Tworzenie koloru szarego
let graySpace = CGColorSpaceCreateDeviceGray()
let grayColor = CGColorCreate(graySpace, [0.5, 1.0])
W przykładzie wykonana jest konwersja jasnozielonego koloru z Display P3 na sRGB. Przy takiej konwersji kolory poza gamutem sRGB zostaną dostosowane, co może zmienić odcień.
let p3Space = CGColorSpaceCreateWithName(kCGColorSpaceDisplayP3)
let sRGBSpace = CGColorSpaceCreateWithName(kCGColorSpaceSRGB)
// Jasnozielony w Display P3 (poza gamutem sRGB)
let p3Green = CGColorCreate(p3Space, [0.0, 1.0, 0.0, 1.0])
// Konwersja na sRGB
let srgbGreen = CGColorCreateCopyByMatchingToColorSpace(
sRGBSpace, p3Green, kCGRenderingIntentDefault
)
Ten przykład demonstruje rysowanie wypełnionego okręgu z użyciem CGColor w niestandardowym UIView. Metoda draw pobiera bieżący kontekst graficzny UIGraphicsGetCurrentContext, w którym ustawiany jest kolor wypełnienia.
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))
}
}
Często zadawane pytania
CGColor — to niskopoziomowa reprezentacja koloru z Core Graphics używana w API w stylu C. UIColor — to wysokopoziomowe opakowanie UIKit, które wewnętrznie przechowuje CGColor i dodaje obsługę różnic w trybie ciemnym (traitCollection). UIColor można przekonwertować na CGColor przez właściwość .cgColor.
Przestrzeń kolorów określa, jak numeryczne komponenty są interpretowane jako widzialny kolor. Ten sam zestaw liczb (1.0, 0.0, 0.0) oznacza czerwony w RGB, ale cyjan w CMYK. Bez CGColorSpace Core Graphics nie może poprawnie wyświetlić koloru na konkretnym urządzeniu z jego unikalnymi charakterystykami wyświetlacza.
Na iOS kontekst graficzny UIView domyślnie tworzony jest z przestrzenią kolorów DeviceRGB. Na urządzeniach z wyświetlaczem o szerokim gamucie (iPad Pro 9.7 cala i nowsze, iPhone 7 i nowsze) dostępne jest również Display P3, które obsługuje o 25% więcej kolorów niż standardowe sRGB.
Nie, CGColor jest niezmiennym (immutable) obiektem. Aby uzyskać kolor z innymi komponentami, należy utworzyć nowy CGColor przez CGColorCreate. Jest to zgodne z projektem Core Graphics, gdzie większość obiektów jest niezmienna dla zapewnienia bezpieczeństwa wątkowego i przewidywalności rysowania.
Do konwersji użyj CGColorCreateCopyByMatchingToColorSpace z docelową przestrzenią CMYK. Core Graphics wykona konwersję przez profile ICC z uwzględnieniem intentu renderowania. Wybierz kCGRenderingIntentRelativeColorimetric do druku lub kCGRenderingIntentPerceptual do fotorealistycznych obrazów.
Podsumowanie
CGColorCreateCopyByMatchingToColorSpaceOpracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również