CGColor at CGColorSpace: ano ito, mga modelo ng kulay at kung paano pamahalaan ang mga ito

May-akda: IT Sectr Nai-publish: 2026-07-21 Oras ng pagbabasa: 9 min

Ang paggawa gamit ang kulay sa Core Graphics ay binuo sa paligid ng dalawang magkakaugnay na entity — CGColor at CGColorSpace. Ang CGColor ay kumakatawan sa isang partikular na kulay na may mga bahagi, at ang CGColorSpace ay tumutukoy sa modelo ng interpretasyon ng mga bahaging ito. Ayon sa Apple Documentation (2026), sinusuportahan ng Core Graphics ang higit sa 20 karaniwang espasyo ng kulay, kabilang ang sRGB, Generic Gray at Generic CMYK. Ang pag-unawa sa pagkakaiba sa pagitan ng CGColor at CGColorSpace ay kinakailangan para sa tamang pagguhit ng mga graphics sa iOS at macOS.

Mga pangunahing punto

  • CGColor — bagay na nag-iimbak ng mga bahagi ng kulay at isang sanggunian sa espasyo ng kulay
  • CGColorSpace — bagay na tumutukoy sa modelo ng interpretasyon ng mga bahagi ng kulay (RGB, Gray, CMYK)
  • Ang bawat CGColor ay nakaugnay sa eksaktong isang CGColorSpace — ang kulay na walang espasyo ay itinuturing na hindi kumpleto
  • Core Graphics ay nagbibigay ng pamamahala ng kulay na nakabatay sa ICC para sa tumpak na pagpaparami ng kulay sa pagitan ng mga device
  • Ang conversion sa pagitan ng mga espasyo ng kulay ay ginagawa sa pamamagitan ng ColorSync sa macOS at sa pamamagitan ng Quartz Core sa iOS

Ano ang CGColor at CGColorSpace?

CGColor — ay isang pangunahing bagay ng Core Graphics na kumakatawan sa isang kulay. Sa istraktura ng CGColor ay nakaimbak ang mga numerikong halaga ng mga bahagi ng kulay at isang sanggunian sa CGColorSpace — ang espasyo ng kulay kung saan ang mga bahaging ito ay binibigyang kahulugan. Nang walang pagkakabit sa espasyo ng kulay, ang mga numerikong halaga ng mga bahagi ay walang kahulugan: ang halaga (1.0, 0.0, 0.0) sa RGB ay pula, ngunit sa CMYK ito ay cyan (Cyan).

CGColorSpace — ay isang bagay na tumutukoy sa modelo ng kulay at saklaw ng mga halagang maaaring katawanin (gamut). Ang espasyo ng kulay ay nagtatakda ng mga panuntunan kung saan ang mga numerikong bahagi ay nagiging nakikitang kulay sa isang partikular na output device. Sinusuportahan ng Core Graphics ang parehong karaniwang mga espasyong may ICC profile at mga pasadyang espasyo na nilikha sa pamamagitan ng CGColorSpace na may mga pasadyang talahanayan ng conversion.

Ang arkitektura ng paghihiwalay ng kulay at espasyo ng kulay — isang pangunahing tampok ng Core Graphics na nagpapaiba nito mula sa mga API kung saan ang kulay ay nakaimbak bilang isang simpleng hanay ng mga numero. Ang pamamaraang ito ay nagpapahintulot sa Core Graphics na magsagawa ng pamamahala ng kulay na independyente sa hardware: ang parehong CGColor object ay maaaring maipakita nang tama sa iba't ibang mga screen salamat sa awtomatikong conversion ng mga bahagi sa pamamagitan ng CGColorSpace profile.

Paano gumagana ang mga kulay sa Core Graphics

Core Graphics ay nagpapatupad ng kulay sa pamamagitan ng isang modelong batay sa mga ICC profile (International Color Consortium). Ang bawat CGColorSpace ay naglalaman ng sanggunian sa isang ICC profile — isang pamantayang paglalarawan kung paano ang mga bahagi ng kulay ay na-convert sa CIE XYZ — isang espasyo ng kulay na independyente sa hardware. Ito ay nagpapahintulot sa Core Graphics na magsagawa ng awtomatikong colorimetric compensation sa pagitan ng iba't ibang mga screen.

Siklo ng buhay ng CGColor object

Sa paglikha ng CGColor sa pamamagitan ng function na CGColorCreate, ang mga bahagi ay kinukuha mula sa ipinadalang array at nakaugnay sa tinukoy na CGColorSpace. Kinokopya ng Core Graphics ang mga bahagi sa panloob na representasyon at lumilikha ng asosasyon sa espasyo ng kulay. Pagkatapos nito, ang kulay ay handa nang gamitin sa anumang graphic na operasyon — punan, balangkas, gradient, anino.

Pamamahala ng kulay sa pamamagitan ng ColorSync

Sa macOS ang pamamahala ng kulay ay ginagawa sa pamamagitan ng ColorSync framework na isinama sa Core Graphics. Sinusubaybayan ng ColorSync ang pagkakalibrate ng screen at awtomatikong kino-convert ang mga bahagi mula sa espasyo ng kulay ng pinagmulan patungo sa espasyo ng target na device. Sa iOS ang pamamahala ng kulay ay ipinatupad sa pamamagitan ng Quartz Core na may suporta para sa malawak na gamut ng kulay (Display P3), simula sa iPhone 7.

Mga pangunahing modelo ng kulay sa CGColorSpace

CGColorSpace ay sumusuporta sa apat na pangunahing modelo ng kulay: RGB (DeviceRGB, sRGB, Display P3), Gray (DeviceGray), CMYK (DeviceCMYK) at Lab. Ang bawat modelo ay tumutukoy sa bilang at kahulugan ng mga bahagi ng kulay. Ang RGB ay gumagamit ng tatlong channel — pula, berde, asul; Gray — isang channel ng liwanag; CMYK — apat na channel para sa pag-print; Lab — tatlong channel: liwanag at dalawang bahagi ng pagkakaiba ng kulay.

Modelo ng kulayMga bahagiPaggamitUri ng CGColorSpace
RGBRed, Green, BlueMga screen, graphics para sa iOS/macOSkCGColorSpaceSRGB
GrayWhite (isang channel)Graphics na itim-puti, mga aninokCGColorSpaceGenericGray
CMYKCyan, Magenta, Yellow, BlackMga produkto sa pag-print, PDFkCGColorSpaceGenericCMYK
Display P3R, G, B (malawak na gamut)Mga modernong iOS devicekCGColorSpaceDisplayP3

DeviceRGB at sRGB

DeviceRGB — ay ang pinakakaraniwang default na espasyo ng kulay ng Core Graphics. Ito ay gumagamit ng gamut ng kulay ng isang karaniwang LCD screen na walang ICC profiling. Sa paglikha ng graphic na konteksto ng UIView o NSView, awtomatikong itinatalaga ng Core Graphics ang DeviceRGB bilang default na espasyo ng kulay. Ang sRGB — ay isang bersyon na may ICC profile na may takdang gamut at gamma, inirerekomenda para sa nilalaman ng web.

Display P3 — malawak na gamut ng kulay

Display P3 — espasyo ng kulay na batay sa DCI-P3 standard, ginagamit sa mga modernong iOS device na may malawak na gamut na display. Ito ay sumasaklaw ng humigit-kumulang 25% mas maraming nakikitang kulay kaysa sa sRGB, lalo na sa berde at pulang bahagi ng spectrum. Para sa paggawa gamit ang Display P3 sa iOS, ginagamit ang constant na kCGColorSpaceDisplayP3, available mula noong iOS 9.3.

Paglikha at pamamahala ng CGColor

CGColor ay nilikha sa pamamagitan ng function na CGColorCreate, na tumatanggap ng CGColorSpace at isang array ng mga bahagi ng uri na CGFloat. Ang bilang ng mga bahagi ay depende sa modelo ng kulay: para sa Gray — 1, para sa RGB — 3, para sa CMYK — 4. Pagkatapos ng paglikha, ang CGColor ay isang hindi nababagong (immutable) object — ang mga bahagi nito ay hindi maaaring baguhin, isang bagong kulay lamang ang maaaring likhain.

Ang Core Graphics ay nagbibigay din ng mga function na CGColorCreateGenericRGB, CGColorCreateGenericGray at CGColorCreateGenericCMYK para sa paglikha ng mga kulay sa karaniwang (generic) na mga espasyo ng kulay. Ang mga function na ito ay pinapasimple ang code, inaalis ang pangangailangan na lumikha ng CGColorSpace nang tahasan. Bilang karagdagan, sa Quartz 2D ay tinukoy ang mga constant ng mga pangunahing kulay: kCGColorWhite, kCGColorBlack, kCGColorClear.

Sa paglikha ng kulay, mahalaga ang pagkakasunud-sunod ng pagtukoy ng mga bahagi — dapat itong mahigpit na tumutugma sa pagkakasunud-sunod ng channel na tinukoy ng modelo ng espasyo ng kulay. RGB: pula (0.0–1.0), berde, asul, alpha (0.0–1.0). Gray: liwanag, alpha. CMYK: cyan, magenta, dilaw, itim, alpha. Ang paglabag sa pagkakasunud-sunod ng mga bahagi ay humahantong sa maling pagpapakita ng kulay nang walang error sa compilation.

Alpha channel at transparency

Alpha channel — ang ikaapat na bahagi (o pangalawa para sa Gray) na kumokontrol sa transparency ng kulay. Ang halagang 1.0 ay tumutugma sa ganap na opacity, 0.0 — ganap na transparency. Ang alpha channel sa CGColor ay opsyonal: ang function na CGColorGetAlpha ay nagbabalik ng kasalukuyang halaga ng alpha, na default ay 1.0 kapag nilikha sa pamamagitan ng mga pangunahing function. Sa paghahalo ng mga kulay, ginagamit ng Core Graphics ang alpha composite ayon sa panuntunang Porter-Duff Source Over.

Paggawa gamit ang CGColorSpace

CGColorSpace ay nilikha sa pamamagitan ng mga factory function ng Core Graphics: CGColorSpaceCreateDeviceRGB, CGColorSpaceCreateDeviceGray, CGColorSpaceCreateDeviceCMYK o CGColorSpaceCreateWithName para sa mga pinangalanang espasyo (sRGB, Display P3, Generic Gray). Ang CGColorSpace object ay hindi nababago at thread-safe — ang parehong object ay maaaring gamitin sa maraming graphic na konteksto.

Pagkuha ng mga pangunahing CGColorSpace

Core Graphics ay nagbibigay ng ilang paunang tinukoy na mga espasyo ng kulay sa pamamagitan ng mga pinangalanang constant: kCGColorSpaceSRGB, kCGColorSpaceDisplayP3, kCGColorSpaceGenericGrayGamma2_2. Ang mga constant na ito ay ipinapasa sa CGColorSpaceCreateWithName. Para sa mga iOS device na may malawak na gamut ng kulay, inirerekomenda ang paggamit ng Display P3, dahil ang sRGB ay maaaring hindi ganap na magamit ang mga kakayahan ng display.

Mga ICC profile at pasadyang CGColorSpace

Mga ICC profile — ay mga pamantayang file na naglalarawan ng mga katangian ng kulay ng device. Pinapayagan ng Core Graphics ang paglikha ng CGColorSpace batay sa anumang ICC profile sa pamamagitan ng CGColorSpaceCreateWithICCProfile. Ito ay ginagamit sa mga propesyonal na application para sa photo printing at prepress, kung saan kinakailangan ang tumpak na pagkakatugma sa isang partikular na printer o monitor.

Conversion sa pagitan ng mga espasyo ng kulay

Core Graphics ay nagsasagawa ng conversion sa pagitan ng mga espasyo ng kulay nang awtomatiko sa pagguhit sa pamamagitan ng function na CGContextSetFillColorWithColor o CGContextSetStrokeColorWithColor. Kung ang espasyo ng kulay ng graphic na konteksto ay naiiba mula sa espasyo ng kulay ng ipinadalang CGColor, ang Quartz 2D ay nagsasagawa ng conversion gamit ang mga ICC profile ng parehong espasyo.

Para sa tahasang conversion ng kulay, ginagamit ang CGColorCreateCopyByMatchingToColorSpace — ang function ay lumilikha ng bagong CGColor na ang mga bahagi ay muling kinakalkula mula sa pinagmulang espasyo patungo sa target na espasyo. Ayon sa Apple Technical Note TN2313 (2024), sa conversion mula sa Display P3 patungo sa sRGB, ang mga kulay sa labas ng gamut ng sRGB ay pinuputol, na humahantong sa pagkawala ng saturation. Ito ay lalo na kapansin-pansin sa matingkad na berde at pulang kulay.

ColorSync sa macOS ay nagbibigay ng pamamahala ng kulay ng system sa antas ng graphic stack. Kung ang application ay hindi tumutukoy ng tahasang espasyo ng kulay, ginagamit ng Core Graphics ang espasyo ng screen na nakuha mula sa ColorSync. Ito ay ginagarantiyahan na ang mga kulay ay magmumukhang pareho sa iba't ibang monitor, kahit na gumagamit sila ng iba't ibang profile ng kulay.

Mga halimbawa ng code sa Swift

Tingnan natin ang mga praktikal na halimbawa ng paglikha at paggamit ng CGColor at CGColorSpace sa isang iOS application. Ang code ay nakasulat sa Swift gamit ang Core Graphics function.

Paglikha ng CGColor na may iba't ibang espasyo ng kulay

Ang halimbawang ito ay nagpapakita ng paglikha ng pulang kulay sa tatlong magkakaibang espasyo ng kulay. Sa kabila ng parehong mga bahagi ng RGB, ang kulay ay magmumukhang naiiba depende sa gamut ng kulay ng CGColorSpace.

swift
import CoreGraphics

// Paglikha ng kulay sa DeviceRGB
let rgbSpace = CGColorSpaceCreateDeviceRGB()
let redColor = CGColorCreate(rgbSpace, [1.0, 0.0, 0.0, 1.0])

// Paglikha ng kulay sa Display P3
let p3Space = CGColorSpaceCreateWithName(kCGColorSpaceDisplayP3)
let p3RedColor = CGColorCreate(p3Space, [1.0, 0.0, 0.0, 1.0])

// Paglikha ng kulay abo
let graySpace = CGColorSpaceCreateDeviceGray()
let grayColor = CGColorCreate(graySpace, [0.5, 1.0])

Conversion ng kulay sa pagitan ng mga espasyo ng kulay

Sa halimbawa, ang conversion ng matingkad na berdeng kulay mula sa Display P3 patungo sa sRGB ay ginagawa. Sa ganitong conversion, ang mga kulay sa labas ng gamut ng sRGB ay iaangkop, na maaaring magbago ng kulay.

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

// Matingkad na berde sa Display P3 (labas sa gamut ng sRGB)
let p3Green = CGColorCreate(p3Space, [0.0, 1.0, 0.0, 1.0])

// Pag-convert sa sRGB
let srgbGreen = CGColorCreateCopyByMatchingToColorSpace(
    sRGBSpace, p3Green, kCGRenderingIntentDefault
)

Paggamit ng CGColor sa graphic na konteksto

Ang halimbawang ito ay nagpapakita ng pagguhit ng punong bilog gamit ang CGColor sa isang pasadyang UIView. Ang pamamaraang draw ay kumukuha ng kasalukuyang graphic na konteksto UIGraphicsGetCurrentContext, kung saan itinatakda ang kulay ng punan.

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

Mga madalas itanong

Paano naiiba ang CGColor sa UIColor?

CGColor — ay isang mababang antas na representasyon ng kulay mula sa Core Graphics na ginagamit sa C-style API. Ang UIColor — ay isang mataas na antas na wrapper ng UIKit na panloob na nag-iimbak ng CGColor at nagdaragdag ng suporta para sa mga pagkakaiba sa dark mode (traitCollection). Ang UIColor ay maaaring i-convert sa CGColor sa pamamagitan ng property na .cgColor.

Bakit kailangan tukuyin ang espasyo ng kulay para sa CGColor?

Ang espasyo ng kulay ay tumutukoy kung paano binibigyang kahulugan ang mga numerikong bahagi bilang nakikitang kulay. Ang parehong hanay ng mga numero (1.0, 0.0, 0.0) ay nangangahulugang pula sa RGB, ngunit cyan sa CMYK. Kung walang CGColorSpace, hindi maaaring maipakita nang tama ng Core Graphics ang kulay sa isang partikular na device na may natatanging katangian ng screen.

Anong espasyo ng kulay ang ginagamit bilang default sa iOS?

Sa iOS ang graphic na konteksto ng UIView ay default na nilikha gamit ang DeviceRGB na espasyo ng kulay. Sa mga device na may malawak na gamut na display (iPad Pro 9.7 pulgada at mas bago, iPhone 7 at mas bago) ay available din ang Display P3, na sumusuporta ng 25% mas maraming kulay kaysa sa karaniwang sRGB.

Mababago ba ang mga bahagi ng CGColor pagkatapos ng paglikha?

Hindi, ang CGColor ay isang hindi nababagong (immutable) na object. Para makakuha ng kulay na may iba pang bahagi, kailangang lumikha ng bagong CGColor sa pamamagitan ng CGColorCreate. Ito ay naaayon sa disenyo ng Core Graphics, kung saan ang karamihan sa mga object ay hindi nababago upang matiyak ang thread-safety at predictability ng pagguhit.

Paano i-convert ang CGColor mula RGB patungo sa CMYK?

Para sa conversion, gamitin ang CGColorCreateCopyByMatchingToColorSpace na may target na CMYK space. Ang Core Graphics ay magsasagawa ng conversion sa pamamagitan ng ICC profile na isinasaalang-alang ang rendering intent. Piliin ang kCGRenderingIntentRelativeColorimetric para sa pag-print o kCGRenderingIntentPerceptual para sa mga photorealistic na larawan.

Buod

  • CGColor — hindi nababagong object ng kulay na may mga bahagi at sanggunian sa espasyo ng kulay
  • CGColorSpace — tumutukoy sa modelo ng kulay (RGB, Gray, CMYK) at saklaw ng mga mailalarawang kulay
  • DeviceRGB — default na espasyo ng kulay para sa graphic na konteksto ng iOS at macOS
  • Display P3 — malawak na espasyo ng kulay para sa modernong Apple device na may 25% mas maraming saklaw kaysa sa sRGB
  • Mga ICC profile ay nagsisiguro ng tumpak na conversion ng kulay sa pagitan ng iba't ibang device sa pamamagitan ng ColorSync
  • Alpha channel — opsyonal na bahagi ng transparency na nakikilahok sa Porter-Duff composite
  • Conversion sa pagitan ng mga espasyo ay ginagawa nang awtomatiko sa pagguhit o tahasan sa pamamagitan ng CGColorCreateCopyByMatchingToColorSpace

Gagawa kami ng mobile application na turnkey

Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.

Pag-usapan ang proyekto

Basahin din