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 — 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.
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 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.
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.
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ínmodell | Komponensek | Alkalmazás | CGColorSpace típus |
|---|---|---|---|
| RGB | Red, Green, Blue | Kijelzők, grafika iOS/macOS rendszerhez | kCGColorSpaceSRGB |
| Gray | White (egy csatorna) | Fekete-fehér grafika, árnyékok | kCGColorSpaceGenericGray |
| CMYK | Cyan, Magenta, Yellow, Black | Nyomtatott termékek, PDF | kCGColorSpaceGenericCMYK |
| Display P3 | R, G, B (széles gamut) | Modern iOS eszközök | kCGColorSpaceDisplayP3 |
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 — 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 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 — 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.
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ó.
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 — 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.
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.
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.
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.
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])
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.
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
)
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.
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
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á.
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.
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.
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.
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
CGColorCreateCopyByMatchingToColorSpace függvényen keresztülKulcsraké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.
Olvassa el is