CGColor i CGColorSpace: czym są, modele kolorów i jak nimi zarządzać

Autor: IT Sectr Opublikowano: 2026-07-21 Czas czytania: 9 min

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 — obiekt przechowujący komponenty koloru i odwołanie do przestrzeni kolorów
  • CGColorSpace — obiekt określający model interpretacji komponentów kolorów (RGB, Gray, CMYK)
  • Każdy CGColor jest powiązany z dokładnie jednym CGColorSpace — kolor bez przestrzeni jest uważany za niekompletny
  • Core Graphics zapewnia zarządzanie kolorem oparte na ICC dla dokładnego odwzorowania kolorów między urządzeniami
  • Konwersja między przestrzeniami kolorów jest wykonywana przez ColorSync na macOS i przez Quartz Core na iOS

Czym są CGColor i CGColorSpace?

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.

Jak działają kolory w Core Graphics

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.

Cykl życia obiektu CGColor

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

Zarządzanie kolorem przez ColorSync

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.

Podstawowe modele kolorów w CGColorSpace

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 koloruKomponentyZastosowanieTyp CGColorSpace
RGBRed, Green, BlueEkrany, grafika dla iOS/macOSkCGColorSpaceSRGB
GrayWhite (jeden kanał)Grafika czarno-biała, cieniekCGColorSpaceGenericGray
CMYKCyan, Magenta, Yellow, BlackProdukcja drukarska, PDFkCGColorSpaceGenericCMYK
Display P3R, G, B (szeroki gamut)Nowoczesne urządzenia iOSkCGColorSpaceDisplayP3

DeviceRGB i sRGB

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 — szeroki gamut kolorów

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.

Tworzenie i zarządzanie CGColor

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 i przezroczystość

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.

Praca z CGColorSpace

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.

Pobieranie podstawowych CGColorSpace

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 i niestandardowe CGColorSpace

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.

Konwersja między przestrzeniami kolorów

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.

Przykłady kodu w Swift

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.

Tworzenie CGColor z różnymi przestrzeniami kolorów

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.

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

Konwersja koloru między przestrzeniami kolorów

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

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

Używanie CGColor w kontekście graficznym

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.

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

Często zadawane pytania

Czym różni się CGColor od UIColor?

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.

Po co określać przestrzeń kolorów dla 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.

Jaka przestrzeń kolorów jest domyślnie używana w iOS?

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.

Czy można zmienić komponenty CGColor po utworzeniu?

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.

Jak przekonwertować CGColor z RGB na CMYK?

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

  • CGColor — niezmienny obiekt koloru z komponentami i odwołaniem do przestrzeni kolorów
  • CGColorSpace — określa model koloru (RGB, Gray, CMYK) i zakres reprezentowalnych kolorów
  • DeviceRGB — domyślna przestrzeń kolorów dla kontekstu graficznego iOS i macOS
  • Display P3 — przestrzeń o szerokim gamucie dla nowoczesnych urządzeń Apple z pokryciem o 25% większym niż sRGB
  • Profile ICC zapewniają dokładną konwersję kolorów między różnymi urządzeniami przez ColorSync
  • Kanał alfa — opcjonalny komponent przezroczystości uczestniczący w kompozycji Porter-Duff
  • Konwersja między przestrzeniami wykonywana jest automatycznie podczas rysowania lub jawnie przez CGColorCreateCopyByMatchingToColorSpace

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

Omów projekt

Przeczytaj również