Рад са бојом у Core Graphics се заснива на две међусобно повезане целине — CGColor и CGColorSpace. CGColor представља конкретну боју са компонентама, а CGColorSpace одређује модел интерпретације ових компоненти. Према Apple Documentation (2026), Core Graphics подржава преко 20 стандардних просторних боја, укључујући sRGB, Generic Gray и Generic CMYK. Разумевање разлике између CGColor и CGColorSpace је неопходно за исправно цртање графике на iOS и macOS.
Главно
CGColor — основни Core Graphics објекат који представља боју. У структури CGColor се чувају нумеричке вредности компоненти боје и референца на CGColorSpace — простор боје у коме се ове компоненте интерпретирају. Без повезивања са простором боје, нумеричке вредности компоненти немају смисла: вредност (1.0, 0.0, 0.0) у RGB је црвена, а у CMYK је цијан (Cyan).
CGColorSpace — објекат који одређује модел боје и опсег представивих вредности (gamut). Простор боје поставља правила по којима се нумеричке компоненте претварају у видљиву боју на одређеном излазном уређају. Core Graphics подржава како стандардне ICC-профилисане просторе, тако и прилагођене просторе створене преко CGColorSpace са прилагођеним табелама конверзије.
Архитектура раздвајања боје и простора боје — кључна карактеристика Core Graphics која је разликује од API-ја где се боја чува као једноставан скуп бројева. Овакав приступ омогућава Core Graphics да врши управљање бојом независно од хардвера: исти CGColor објекат може бити исправно приказан на различитим екранима захваљујући аутоматској конверзији компоненти кроз CGColorSpace профил.
Core Graphics имплементира боју кроз модел заснован на ICC профилима (International Color Consortium). Сваки CGColorSpace садржи референцу на ICC профил — стандардизовани опис како се компоненте боје претварају у CIE XYZ — простор боје независтан од хардвера. Ово омогућава Core Graphics да врши аутоматску колориметријску компензацију између различитих екрана.
Приликом креирања CGColor преко функције CGColorCreate долази до преузимања компоненти из прослеђеног низа и повезивања са наведеним CGColorSpace. Core Graphics копира компоненте у унутрашњу репрезентацију и ствара асоцијацију са простором боје. Након тога, боја је спремна за употребу у било којој графичкој операцији — попуњавање, контура, градијент, сенка.
На macOS управљање бојом се врши преко ColorSync оквира интегрисаног у Core Graphics. ColorSync прати калибрацију екрана и аутоматски претвара компоненте из просторне боје извора у простор циљног уређаја. На iOS управљање бојом је имплементирано преко Quartz Core са подршком за широки опсег боја (Display P3), почевши од iPhone 7.
CGColorSpace подржава четири основна модела боја: RGB (DeviceRGB, sRGB, Display P3), Gray (DeviceGray), CMYK (DeviceCMYK) и Lab. Сваки модел одређује број и значење компоненти боје. RGB користи три канала — црвени, зелени, плави; Gray — један канал осветљености; CMYK — четири канала за штампање; Lab — три канала: осветљеност и две компоненте разлике боја.
| Модел боје | Компоненте | Примена | CGColorSpace тип |
|---|---|---|---|
| RGB | Red, Green, Blue | Екрани, графика за iOS/macOS | kCGColorSpaceSRGB |
| Gray | White (један канал) | Црно-бела графика, сенке | kCGColorSpaceGenericGray |
| CMYK | Cyan, Magenta, Yellow, Black | Штампани производи, PDF | kCGColorSpaceGenericCMYK |
| Display P3 | R, G, B (широки опсег) | Савремени iOS уређаји | kCGColorSpaceDisplayP3 |
DeviceRGB — најчешћи подразумевани простор боје Core Graphics. Користи опсег боја стандардног LCD екрана без ICC профилисања. Приликом креирања графичког контекста UIView или NSView, Core Graphics аутоматски поставља DeviceRGB као подразумевани простор боје. sRGB — ICC профилисана верзија са фиксним опсегом и гама вредношћу, препоручена за веб садржај.
Display P3 — простор боје заснован на стандарду DCI-P3, који се користи у савременим iOS уређајима са екранима широког опсега боја. Покрива приближно 25% више видљивих боја од sRGB, посебно у зеленој и црвеној области спектра. За рад са Display P3 на iOS користи се константа kCGColorSpaceDisplayP3, доступна од iOS 9.3.
CGColor се креира преко функције CGColorCreate, која прима CGColorSpace и низ компоненти типа CGFloat. Број компоненти зависи од модела боје: за Gray — 1, за RGB — 3, за CMYK — 4. Након креирања, CGColor је непроменљив (immutable) објекат — његове компоненте се не могу мењати, могуће је само креирати нову боју.
Core Graphics такође пружа функције CGColorCreateGenericRGB, CGColorCreateGenericGray и CGColorCreateGenericCMYK за креирање боја у стандардним (generic) просторним бојама. Ове функције поједностављују код, уклањајући потребу за експлицитним креирањем CGColorSpace. Поред тога, у Quartz 2D су дефинисане константе основних боја: kCGColorWhite, kCGColorBlack, kCGColorClear.
Приликом креирања боје важан је редослед навођења компоненти — мора строго да одговара редоследу канала одређеном моделом простора боје. RGB: црвена (0.0–1.0), зелена, плава, алфа (0.0–1.0). Gray: осветљеност, алфа. CMYK: цијан, магента, жута, црна, алфа. Кршење редоследа компоненти доводи до неисправног приказа боје без грешке компајлације.
Алфа канал — четврта компонента (или друга за Gray) која управља провидношћу боје. Вредност 1.0 одговара потпуној непровидносту, 0.0 — потпуној провидносту. Алфа канал у CGColor је опциони: функција CGColorGetAlpha враћа тренутну вредност алфе, која подразумевано износи 1.0 при креирању преко основних функција. При мешању боја, Core Graphics користи алфа композицију по правилу Porter-Duff Source Over.
CGColorSpace се креира преко фабричких функција Core Graphics: CGColorSpaceCreateDeviceRGB, CGColorSpaceCreateDeviceGray, CGColorSpaceCreateDeviceCMYK или CGColorSpaceCreateWithName за именоване просторе (sRGB, Display P3, Generic Gray). CGColorSpace објекат је непроменљив и thread-safe — исти објекат може да се користи у више графичких контекста.
Core Graphics пружа неколико предефинисаних просторних боја кроз именоване константе: kCGColorSpaceSRGB, kCGColorSpaceDisplayP3, kCGColorSpaceGenericGrayGamma2_2. Ове константе се прослеђују CGColorSpaceCreateWithName. За iOS уређаје са широким опсегом боја препоручује се коришћење Display P3, јер sRGB можда неће у потпуности искористити могућности екрана.
ICC профили — стандардизоване датотеке које описују карактеристике боје уређаја. Core Graphics омогућава креирање CGColorSpace на основу произвољног ICC профила преко CGColorSpaceCreateWithICCProfile. Ово се користи у професионалним апликацијама за фотоштампање и prepress, где је потребна тачна усклађеност са одређеним штампачем или монитором.
Core Graphics врши претварање између просторних боја аутоматски приликом цртања преко функције CGContextSetFillColorWithColor или CGContextSetStrokeColorWithColor. Ако се простор боје графичког контекста разликује од простора боје прослеђеног CGColor, Quartz 2D врши конверзију коришћењем ICC профила оба простора.
За експлицитно претварање боје користи се CGColorCreateCopyByMatchingToColorSpace — функција креира нови CGColor чије су компоненте прерачунате из изворног простора у циљни. Према Apple Technical Note TN2313 (2024), приликом конверзије из Display P3 у sRGB, боје ван опсега sRGB се одсецају, што доводи до губитка засићења. Ово је посебно приметно на јарко зеленим и црвеним нијансама.
ColorSync на macOS обезбеђује системско управљање бојом на нивоу графичког стека. Ако апликација не задаје експлицитни простор боје, Core Graphics користи простор екрана добијен од ColorSync. Ово гарантује да ће боје изгледати исто на различитим мониторима, чак и ако они користе различите профиле боја.
Размотримо практичне примере креирања и коришћења CGColor и CGColorSpace у iOS апликацији. Код је написан у Swift-у коришћењем Core Graphics функција.
Овај пример приказује креирање црвене боје у три различита простора боје. Упркос истим RGB компонентама, боја ће изгледати другачије у зависности од опсега боје CGColorSpace.
import CoreGraphics
// Креирање боје у DeviceRGB
let rgbSpace = CGColorSpaceCreateDeviceRGB()
let redColor = CGColorCreate(rgbSpace, [1.0, 0.0, 0.0, 1.0])
// Креирање боје у Display P3
let p3Space = CGColorSpaceCreateWithName(kCGColorSpaceDisplayP3)
let p3RedColor = CGColorCreate(p3Space, [1.0, 0.0, 0.0, 1.0])
// Креирање сиве боје
let graySpace = CGColorSpaceCreateDeviceGray()
let grayColor = CGColorCreate(graySpace, [0.5, 1.0])
У примеру се врши конверзија јарко зелене боје из Display P3 у sRGB. При таквој конверзији, боје ван sRGB опсега ће бити прилагођене, што може променити нијансу.
let p3Space = CGColorSpaceCreateWithName(kCGColorSpaceDisplayP3)
let sRGBSpace = CGColorSpaceCreateWithName(kCGColorSpaceSRGB)
// Јарко зелена у Display P3 (изван sRGB опсега)
let p3Green = CGColorCreate(p3Space, [0.0, 1.0, 0.0, 1.0])
// Конверзија у sRGB
let srgbGreen = CGColorCreateCopyByMatchingToColorSpace(
sRGBSpace, p3Green, kCGRenderingIntentDefault
)
Овај пример демонстрира цртање попуњеног круга коришћењем CGColor у прилагођеном UIView. Метода draw добија тренутни графички контекст UIGraphicsGetCurrentContext, у коме се поставља боја попуњавања.
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))
}
}
Често постављана питања
CGColor — нижи ниво приказа боје из Core Graphics који се користи у C-стилу API. UIColor — виши ниво омотача UIKit који унутра чува CGColor и додаје подршку за разлике у тамном режиму (traitCollection). UIColor се може претворити у CGColor преко својства .cgColor.
Простор боје одређује како се нумеричке компоненте интерпретирају као видљива боја. Исти скуп бројева (1.0, 0.0, 0.0) значи црвено у RGB, али цијан у CMYK. Без CGColorSpace, Core Graphics не може исправно приказати боју на одређеном уређају са његовим јединственим карактеристикама екрана.
На iOS графички контекст UIView подразумевано се креира са простором боје DeviceRGB. На уређајима са екраном широког опсега боја (iPad Pro 9.7 инча и новији, iPhone 7 и новији) доступан је и Display P3, који подржава 25% више боја од стандардног sRGB.
Не, CGColor је непроменљив (immutable) објекат. За добијање боје са другим компонентама потребно је креирати нови CGColor преко CGColorCreate. Ово је у складу са дизајном Core Graphics, где је већина објеката непроменљива ради обезбеђивања thread-безбедности и предвидљивости цртања.
За претварање користите CGColorCreateCopyByMatchingToColorSpace са циљним CMYK простором. Core Graphics ће извршити конверзију кроз ICC профиле узимајући у обзир рендеринг интент. Изаберите kCGRenderingIntentRelativeColorimetric за штампање или kCGRenderingIntentPerceptual за фотореалистичне слике.
Завршни закључци
CGColorCreateCopyByMatchingToColorSpaceРазвићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође