CGColor és CGColorSpace: mik ezek, színmodellek és hogyan kezeljük őket

Szerző: IT Sectr Megjelenés: 2026-07-21 Olvasási idő: 9 perc

A színekkel való munka a Core Graphics-ben két egymással összefüggő entitás köré épül — CGColor és CGColorSpace. A CGColor egy konkrét színt képvisel komponensekkel, a CGColorSpace pedig e komponensek értelmezési modelljét határozza meg. Az Apple Documentation (2026) szerint a Core Graphics több mint 20 szabványos színteret támogat, beleértve az sRGB-t, a Generic Gray-t és a Generic CMYK-t. A CGColor és CGColorSpace közötti különbség megértése elengedhetetlen a grafika helyes rajzolásához iOS és macOS rendszeren.

Főbb pontok

  • CGColor — objektum, amely tárolja a színkomponenseket és egy hivatkozást a színtérre
  • CGColorSpace — objektum, amely meghatározza a színkomponensek értelmezési modelljét (RGB, Gray, CMYK)
  • Minden CGColor pontosan egy CGColorSpace-hez kapcsolódik — a szín tér nélkül hiányosnak tekintendő
  • Core Graphics ICC-alapú színkezelést biztosít a pontos színvisszaadáshoz az eszközök között
  • A színterek közötti konverzió ColorSync-en keresztül történik macOS-en és Quartz Core-on keresztül iOS-en

Mi az a CGColor és CGColorSpace?

CGColor — egy alapvető Core Graphics objektum, amely egy színt képvisel. A CGColor struktúrában a színkomponensek numerikus értékei és egy hivatkozás a CGColorSpace-re — arra a színtérre, amelyben ezek a komponensek értelmezve vannak — tárolódnak. Színtérhez való kapcsolódás nélkül a komponensek numerikus értékei értelmetlenek: az (1.0, 0.0, 0.0) érték RGB-ben piros, CMYK-ben pedig cián (Cyan).

CGColorSpace — egy objektum, amely meghatározza a színmodellt és az ábrázolható értékek tartományát (gamut). A színtér megadja azokat a szabályokat, amelyek szerint a numerikus komponensek látható színné alakulnak egy adott kimeneti eszközön. A Core Graphics támogatja mind a szabványos ICC-profilozott tereket, mind az egyedi, CGColorSpace-en keresztül létrehozott tereket egyedi konverziós táblázatokkal.

A szín és színtér szétválasztásának architektúrája — a Core Graphics kulcsfontosságú jellemzője, amely megkülönbözteti azoktól az API-któl, ahol a szín egyszerű számsorként van tárolva. Ez a megközelítés lehetővé teszi a Core Graphics számára a hardverfüggetlen színkezelést: ugyanaz a CGColor objektum helyesen jeleníthető meg különböző kijelzőkön a komponensek automatikus konverziójának köszönhetően a CGColorSpace profilon keresztül.

Hogyan működnek a színek a Core Graphics-ben

Core Graphics a színt ICC-profilokon (International Color Consortium) alapuló modellen keresztül valósítja meg. Minden CGColorSpace tartalmaz egy hivatkozást egy ICC-profilra — egy szabványosított leírást arról, hogy a színkomponensek hogyan alakulnak át CIE XYZ-vé — egy hardverfüggetlen színtérré. Ez lehetővé teszi a Core Graphics számára az automatikus kolorimetrikus kompenzációt a különböző kijelzők között.

A CGColor objektum életciklusa

A CGColor CGColorCreate függvényen keresztüli létrehozásakor a komponensek kivonásra kerülnek az átadott tömbből, és hozzákapcsolódnak a megadott CGColorSpace-hez. A Core Graphics másolja a komponenseket a belső reprezentációba, és létrehozza a kapcsolatot a színtérrel. Ezt követően a szín készen áll bármilyen grafikai műveletben való használatra — kitöltés, körvonal, gradiencs, árnyék.

Színkezelés ColorSync-en keresztül

macOS-en a színkezelés a Core Graphics-be integrált ColorSync keretrendszeren keresztül történik. A ColorSync nyomon követi a kijelző kalibrálását, és automatikusan átalakítja a komponenseket a forrás színtérből a cél eszköz terébe. iOS-en a színkezelés a Quartz Core-on keresztül van megvalósítva széles színskálájú támogatással (Display P3), iPhone 7-től kezdődően.

Fő színmodellek a CGColorSpace-ben

CGColorSpace négy alapvető színmodellt támogat: RGB (DeviceRGB, sRGB, Display P3), Gray (DeviceGray), CMYK (DeviceCMYK) és Lab. Minden modell meghatározza a színkomponensek számát és jelentését. Az RGB három csatornát használ — piros, zöld, kék; a Gray — egy fényességcsatornát; a CMYK — négy csatornát nyomtatáshoz; a Lab — három csatornát: fényesség és két színkülönbségi komponens.

SzínmodellKomponensekAlkalmazásCGColorSpace típus
RGBRed, Green, BlueKijelzők, grafika iOS/macOS rendszerhezkCGColorSpaceSRGB
GrayWhite (egy csatorna)Fekete-fehér grafika, árnyékokkCGColorSpaceGenericGray
CMYKCyan, Magenta, Yellow, BlackNyomtatott termékek, PDFkCGColorSpaceGenericCMYK
Display P3R, G, B (széles gamut)Modern iOS eszközökkCGColorSpaceDisplayP3

DeviceRGB és sRGB

DeviceRGB — a Core Graphics leggyakoribb alapértelmezett színtere. Egy szabványos LCD-kijelző színtartományát használja ICC-profilozás nélkül. UIView vagy NSView grafikus kontextusának létrehozásakor a Core Graphics automatikusan a DeviceRGB-t jelöli ki alapértelmezett színtérként. Az sRGB — ICC-profilozott verzió rögzített gamuttal és gammával, webes tartalmakhoz ajánlott.

Display P3 — széles színskálájú gamut

Display P3 — a DCI-P3 szabványon alapuló színtér, amelyet a modern iOS eszközök használnak széles színskálájú kijelzőikkel. Körülbelül 25%-kal több látható színt fed le, mint az sRGB, különösen a spektrum zöld és piros tartományaiban. A Display P3 használatához iOS-en a kCGColorSpaceDisplayP3 konstans használatos, amely iOS 9.3 óta elérhető.

CGColor létrehozása és kezelése

CGColor a CGColorCreate függvényen keresztül jön létre, amely egy CGColorSpace-t és egy CGFloat típusú komponensekből álló tömböt fogad. A komponensek száma a színmodelltől függ: Gray esetén — 1, RGB esetén — 3, CMYK esetén — 4. A létrehozás után a CGColor egy megváltoztathatatlan (immutable) objektum — komponensei nem módosíthatók, csak új szín hozható létre.

A Core Graphics emellett biztosítja a CGColorCreateGenericRGB, CGColorCreateGenericGray és CGColorCreateGenericCMYK függvényeket a színek létrehozásához szabványos (generic) színterekben. Ezek a függvények egyszerűsítik a kódot, kiküszöbölve a CGColorSpace explicit létrehozásának szükségességét. Ezenkívül a Quartz 2D-ben definiálva vannak az alapszínek konstansai: kCGColorWhite, kCGColorBlack, kCGColorClear.

A szín létrehozásakor fontos a komponensek megadásának sorrendje — annak szigorúan meg kell egyeznie a színtér modellje által meghatározott csatornasorrenddel. RGB: piros (0.0–1.0), zöld, kék, alfa (0.0–1.0). Gray: fényesség, alfa. CMYK: cián, bíbor, sárga, fekete, alfa. A komponensek sorrendjének megsértése a szín helytelen megjelenítéséhez vezet fordítási hiba nélkül.

Alfa csatorna és átlátszóság

Alfa csatorna — a negyedik komponens (vagy második Gray esetén), amely a szín átlátszóságát vezérli. Az 1.0 érték teljes átlátszatlanságnak, a 0.0 — teljes átlátszóságnak felel meg. Az alfa csatorna a CGColor-ban opcionális: a CGColorGetAlpha függvény visszaadja az aktuális alfaértéket, amely alapértelmezetten 1.0 az alapfüggvényeken keresztüli létrehozáskor. A színek keverésekor a Core Graphics alfa kompozitálást használ a Porter-Duff Source Over szabály szerint.

Munka CGColorSpace-szel

CGColorSpace a Core Graphics gyári függvényein keresztül jön létre: CGColorSpaceCreateDeviceRGB, CGColorSpaceCreateDeviceGray, CGColorSpaceCreateDeviceCMYK vagy CGColorSpaceCreateWithName névvel ellátott terekhez (sRGB, Display P3, Generic Gray). A CGColorSpace objektum megváltoztathatatlan és szálbiztos — ugyanaz az objektum több grafikus kontextusban is használható.

Alapvető CGColorSpace-ek beszerzése

Core Graphics számos előre definiált színteret biztosít névvel ellátott konstansokon keresztül: kCGColorSpaceSRGB, kCGColorSpaceDisplayP3, kCGColorSpaceGenericGrayGamma2_2. Ezek a konstansok a CGColorSpaceCreateWithName-nek kerülnek átadásra. Széles színskálájú iOS eszközök esetén a Display P3 használata ajánlott, mivel az sRGB nem feltétlenül használja ki teljes mértékben a kijelző képességeit.

ICC-profilok és egyedi CGColorSpace

ICC-profilok — szabványosított fájlok, amelyek leírják az eszköz színjellemzőit. A Core Graphics lehetővé teszi CGColorSpace létrehozását bármilyen ICC-profil alapján a CGColorSpaceCreateWithICCProfile függvényen keresztül. Ezt professzionális fotónyomtatási és prepress alkalmazásokban használják, ahol pontos egyezés szükséges egy adott nyomtatóval vagy monitorral.

Konverzió színterek között

Core Graphics automatikusan végzi el a színterek közötti konverziót a rajzolás során a CGContextSetFillColorWithColor vagy CGContextSetStrokeColorWithColor függvényen keresztül. Ha a grafikus kontextus színtere eltér az átadott CGColor színterétől, a Quartz 2D elvégzi a konverziót mindkét tér ICC-profiljainak felhasználásával.

Explicit színkonverzióhoz a CGColorCreateCopyByMatchingToColorSpace használatos — a függvény létrehoz egy új CGColor-t, amelynek komponensei át lettek számolva a forrástérből a céltérbe. Az Apple Technical Note TN2313 (2024) szerint a Display P3-ból sRGB-be történő konverziónál az sRGB gamutján kívüli színek levágódnak, ami telítettségvesztéshez vezet. Ez különösen az élénk zöld és piros árnyalatoknál észrevehető.

ColorSync macOS-en rendszerszintű színkezelést biztosít a grafikus verem szintjén. Ha az alkalmazás nem ad meg explicit színteret, a Core Graphics a ColorSync-től kapott kijelzőteret használja. Ez garantálja, hogy a színek ugyanúgy fognak kinézni a különböző monitorokon, még akkor is, ha azok különböző színprofilokat használnak.

Kódpéldák Swift-ben

Nézzünk gyakorlati példákat a CGColor és CGColorSpace létrehozására és használatára egy iOS alkalmazásban. A kód Swift nyelven íródott Core Graphics függvények használatával.

CGColor létrehozása különböző színterekkel

Ez a példa egy piros szín létrehozását mutatja három különböző színtérben. Az azonos RGB-komponensek ellenére a szín másképp fog kinézni a CGColorSpace színtartományától függően.

swift
import CoreGraphics

// Szín létrehozása DeviceRGB-ben
let rgbSpace = CGColorSpaceCreateDeviceRGB()
let redColor = CGColorCreate(rgbSpace, [1.0, 0.0, 0.0, 1.0])

// Szín létrehozása Display P3-ben
let p3Space = CGColorSpaceCreateWithName(kCGColorSpaceDisplayP3)
let p3RedColor = CGColorCreate(p3Space, [1.0, 0.0, 0.0, 1.0])

// Szürke szín létrehozása
let graySpace = CGColorSpaceCreateDeviceGray()
let grayColor = CGColorCreate(graySpace, [0.5, 1.0])

Szín konvertálása színterek között

A példában egy élénk zöld szín konverziója történik Display P3-ból sRGB-be. Ilyen konverziónál az sRGB gamutján kívüli színek alkalmazkodnak, ami megváltoztathatja az árnyalatot.

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

// Élénk zöld Display P3-ben (sRGB gamuton kívül)
let p3Green = CGColorCreate(p3Space, [0.0, 1.0, 0.0, 1.0])

// Konvertálás sRGB-be
let srgbGreen = CGColorCreateCopyByMatchingToColorSpace(
    sRGBSpace, p3Green, kCGRenderingIntentDefault
)

CGColor használata grafikus kontextusban

Ez a példa egy kitöltött kör rajzolását mutatja be CGColor használatával egy egyedi UIView-ben. A draw metódus lekéri az aktuális grafikus kontextust UIGraphicsGetCurrentContext, amelyben a kitöltési szín beállításra kerül.

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

Gyakran ismételt kérdések

Miben különbözik a CGColor a UIColor-tól?

CGColor — a Core Graphics alacsony szintű színreprezentációja, amelyet C-stílusú API-ban használnak. A UIColor — a UIKit magas szintű burkolója, amely belsőleg tárolja a CGColor-t, és támogatást ad a sötét mód (traitCollection) különbségeihez. A UIColor a .cgColor tulajdonságon keresztül konvertálható CGColor-rá.

Miért kell megadni a színteret a CGColor számára?

A színtér határozza meg, hogy a numerikus komponensek hogyan értelmeződnek látható színként. Ugyanaz a számsor (1.0, 0.0, 0.0) RGB-ben pirosat, CMYK-ben viszont ciánt jelent. CGColorSpace nélkül a Core Graphics nem tudja helyesen megjeleníteni a színt egy adott eszközön annak egyedi kijelzőjellemzőivel.

Milyen színteret használ alapértelmezetten az iOS?

iOS-en a UIView grafikus kontextusa alapértelmezetten a DeviceRGB színtérrel jön létre. A széles színskálájú kijelzővel rendelkező eszközökön (iPad Pro 9,7 hüvelyk és újabb, iPhone 7 és újabb) a Display P3 is elérhető, amely 25%-kal több színt támogat, mint a szabványos sRGB.

Megváltoztathatók a CGColor komponensei a létrehozás után?

Nem, a CGColor egy megváltoztathatatlan (immutable) objektum. Más komponensekkel rendelkező szín eléréséhez új CGColor-t kell létrehozni a CGColorCreate függvényen keresztül. Ez összhangban van a Core Graphics tervezésével, ahol a legtöbb objektum megváltoztathatatlan a szálbiztonság és a rajzolás kiszámíthatóságának biztosítása érdekében.

Hogyan lehet a CGColor-t RGB-ből CMYK-vé konvertálni?

A konverzióhoz használja a CGColorCreateCopyByMatchingToColorSpace függvényt a cél CMYK térrel. A Core Graphics elvégzi a konverziót ICC-profilokon keresztül, figyelembe véve a renderelési szándékot. Válassza a kCGRenderingIntentRelativeColorimetric értéket nyomtatáshoz vagy a kCGRenderingIntentPerceptual értéket fotorealisztikus képekhez.

Összegzés

  • CGColor — megváltoztathatatlan színobjektum komponensekkel és hivatkozással a színtérre
  • CGColorSpace — meghatározza a színmodellt (RGB, Gray, CMYK) és az ábrázolható színek tartományát
  • DeviceRGB — alapértelmezett színtér az iOS és macOS grafikus kontextusához
  • Display P3 — széles színskálájú tér modern Apple eszközökhöz, 25%-kal nagyobb lefedettséggel, mint az sRGB
  • ICC-profilok biztosítják a pontos színkonverziót különböző eszközök között a ColorSync-en keresztül
  • Alfa csatorna — opcionális átlátszósági komponens, amely részt vesz a Porter-Duff kompozitálásban
  • Konverzió a terek között automatikusan történik rajzoláskor vagy explicit módon a CGColorCreateCopyByMatchingToColorSpace függvényen keresztül

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is