CGColor και CGColorSpace: τι είναι, μοντέλα χρωμάτων και πώς να τα διαχειρίζεστε

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-07-21 Χρόνος ανάγνωσης: 9 λεπ

Η εργασία με το χρώμα στο Core Graphics βασίζεται σε δύο αλληλένδετες οντότητες — CGColor και CGColorSpace. Το CGColor αντιπροσωπεύει ένα συγκεκριμένο χρώμα με συνιστώσες, και το CGColorSpace καθορίζει το μοντέλο ερμηνείας αυτών των συνιστωσών. Σύμφωνα με το Apple Documentation (2026), το Core Graphics υποστηρίζει πάνω από 20 τυπικούς χρωματικούς χώρους, συμπεριλαμβανομένων των sRGB, Generic Gray και Generic CMYK. Η κατανόηση της διαφοράς μεταξύ CGColor και CGColorSpace είναι απαραίτητη για τη σωστή σχεδίαση γραφικών σε iOS και macOS.

Κύρια σημεία

  • CGColor — αντικείμενο που αποθηκεύει τις συνιστώσες χρώματος και μια αναφορά στον χρωματικό χώρο
  • CGColorSpace — αντικείμενο που καθορίζει το μοντέλο ερμηνείας των συνιστωσών χρώματος (RGB, Gray, CMYK)
  • Κάθε CGColor συνδέεται με ακριβώς ένα CGColorSpace — το χρώμα χωρίς χώρο θεωρείται ελλιπές
  • Core Graphics παρέχει διαχείριση χρώματος βασισμένη σε ICC για ακριβή αναπαραγωγή χρωμάτων μεταξύ συσκευών
  • Η μετατροπή μεταξύ χρωματικών χώρων εκτελείται μέσω ColorSync σε macOS και μέσω Quartz Core σε iOS

Τι είναι τα CGColor και CGColorSpace;

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

Core Graphics υλοποιεί το χρώμα μέσω ενός μοντέλου βασισμένου σε προφίλ ICC (International Color Consortium). Κάθε CGColorSpace περιέχει μια αναφορά σε ένα προφίλ ICC — μια τυποποιημένη περιγραφή του πώς οι συνιστώσες χρώματος μετατρέπονται σε CIE XYZ — έναν ανεξάρτητο από υλικό χρωματικό χώρο. Αυτό επιτρέπει στο Core Graphics να εκτελεί αυτόματη χρωματομετρική αντιστάθμιση μεταξύ διαφορετικών οθονών.

Κύκλος ζωής αντικειμένου CGColor

Κατά τη δημιουργία CGColor μέσω της συνάρτησης CGColorCreate, οι συνιστώσες λαμβάνονται από τον παρεχόμενο πίνακα και συνδέονται με το καθορισμένο CGColorSpace. Το Core Graphics αντιγράφει τις συνιστώσες στην εσωτερική αναπαράσταση και δημιουργεί μια συσχέτιση με τον χρωματικό χώρο. Μετά από αυτό, το χρώμα είναι έτοιμο για χρήση σε οποιαδήποτε γραφική λειτουργία — γέμισμα, περίγραμμα, διαβάθμιση, σκιά.

Διαχείριση χρώματος μέσω ColorSync

Σε macOS η διαχείριση χρώματος γίνεται μέσω του πλαισίου ColorSync ενσωματωμένου στο Core Graphics. Το ColorSync παρακολουθεί τη βαθμονόμηση της οθόνης και μετατρέπει αυτόματα τις συνιστώσες από τον χρωματικό χώρο προέλευσης στον χώρο της συσκευής-στόχου. Σε iOS η διαχείριση χρώματος υλοποιείται μέσω Quartz Core με υποστήριξη ευρείας χρωματικής γκάμας (Display P3), ξεκινώντας από το iPhone 7.

Βασικά χρωματικά μοντέλα στο CGColorSpace

CGColorSpace υποστηρίζει τέσσερα βασικά χρωματικά μοντέλα: RGB (DeviceRGB, sRGB, Display P3), Gray (DeviceGray), CMYK (DeviceCMYK) και Lab. Κάθε μοντέλο καθορίζει τον αριθμό και τη σημασία των συνιστωσών χρώματος. Το RGB χρησιμοποιεί τρία κανάλια — κόκκινο, πράσινο, μπλε; το Gray — ένα κανάλι φωτεινότητας; το CMYK — τέσσερα κανάλια για εκτύπωση; το Lab — τρία κανάλια: φωτεινότητα και δύο συνιστώσες χρωματικής διαφοράς.

Χρωματικό μοντέλοΣυνιστώσεςΕφαρμογήΤύπος CGColorSpace
RGBRed, Green, BlueΟθόνες, γραφικά για iOS/macOSkCGColorSpaceSRGB
GrayWhite (ένα κανάλι)Ασπρόμαυρα γραφικά, σκιέςkCGColorSpaceGenericGray
CMYKCyan, Magenta, Yellow, BlackΕκτυπωτικά προϊόντα, PDFkCGColorSpaceGenericCMYK
Display P3R, G, B (ευρεία γκάμα)Σύγχρονες συσκευές iOSkCGColorSpaceDisplayP3

DeviceRGB και sRGB

DeviceRGB — είναι ο πιο κοινός προεπιλεγμένος χρωματικός χώρος του Core Graphics. Χρησιμοποιεί τη χρωματική γκάμα μιας τυπικής οθόνης LCD χωρίς προφίλ ICC. Κατά τη δημιουργία γραφικού περιβάλλοντος UIView ή NSView, το Core Graphics ορίζει αυτόματα το DeviceRGB ως προεπιλεγμένο χρωματικό χώρο. sRGB — έκδοση με προφίλ ICC με σταθερή γκάμα και γάμμα, συνιστάται για διαδικτυακό περιεχόμενο.

Display P3 — ευρεία χρωματική γκάμα

Display P3 — χρωματικός χώρος βασισμένος στο πρότυπο DCI-P3, που χρησιμοποιείται σε σύγχρονες συσκευές iOS με οθόνες ευρείας χρωματικής γκάμας. Καλύπτει περίπου 25% περισσότερα ορατά χρώματα από το sRGB, ειδικά στις πράσινες και κόκκινες περιοχές του φάσματος. Για εργασία με Display P3 σε iOS χρησιμοποιείται η σταθερά kCGColorSpaceDisplayP3, διαθέσιμη από iOS 9.3.

Δημιουργία και διαχείριση CGColor

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

CGColorSpace δημιουργείται μέσω εργοστασιακών συναρτήσεων του Core Graphics: CGColorSpaceCreateDeviceRGB, CGColorSpaceCreateDeviceGray, CGColorSpaceCreateDeviceCMYK ή CGColorSpaceCreateWithName για ονομασμένους χώρους (sRGB, Display P3, Generic Gray). Το αντικείμενο CGColorSpace είναι αμετάβλητο και ασφαλές για πολλαπλά νήματα (thread-safe) — το ίδιο αντικείμενο μπορεί να χρησιμοποιηθεί σε πολλαπλά γραφικά περιβάλλοντα.

Λήψη βασικών CGColorSpace

Core Graphics παρέχει αρκετούς προκαθορισμένους χρωματικούς χώρους μέσω ονομασμένων σταθερών: kCGColorSpaceSRGB, kCGColorSpaceDisplayP3, kCGColorSpaceGenericGrayGamma2_2. Αυτές οι σταθερές μεταβιβάζονται στο CGColorSpaceCreateWithName. Για συσκευές iOS με ευρεία χρωματική γκάμα, συνιστάται η χρήση Display P3, καθώς το sRGB μπορεί να μην αξιοποιεί πλήρως τις δυνατότητες της οθόνης.

Προφίλ ICC και προσαρμοσμένο CGColorSpace

Προφίλ 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. Αυτό εγγυάται ότι τα χρώματα θα φαίνονται ίδια σε διαφορετικές οθόνες, ακόμη και αν χρησιμοποιούν διαφορετικά προφίλ χρώματος.

Παραδείγματα κώδικα σε Swift

Ας εξετάσουμε πρακτικά παραδείγματα δημιουργίας και χρήσης CGColor και CGColorSpace σε μια εφαρμογή iOS. Ο κώδικας είναι γραμμένος σε Swift με χρήση συναρτήσεων Core Graphics.

Δημιουργία CGColor με διαφορετικούς χρωματικούς χώρους

Αυτό το παράδειγμα δείχνει τη δημιουργία κόκκινου χρώματος σε τρεις διαφορετικούς χρωματικούς χώρους. Παρά τις ίδιες συνιστώσες RGB, το χρώμα θα φαίνεται διαφορετικό ανάλογα με τη χρωματική γκάμα του CGColorSpace.

swift
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 θα προσαρμοστούν, γεγονός που μπορεί να αλλάξει την απόχρωση.

swift
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 σε γραφικό περιβάλλον

Αυτό το παράδειγμα δείχνει τη σχεδίαση γεμισμένου κύκλου με χρήση CGColor σε ένα προσαρμοσμένο UIView. Η μέθοδος draw λαμβάνει το τρέχον γραφικό περιβάλλον UIGraphicsGetCurrentContext, στο οποίο ορίζεται το χρώμα γεμίσματος.

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

Συχνές ερωτήσεις

Σε τι διαφέρει το CGColor από το UIColor;

CGColor — είναι μια χαμηλού επιπέδου αναπαράσταση χρώματος από το Core Graphics που χρησιμοποιείται σε API τύπου C. Το UIColor — είναι ένα υψηλού επιπέδου περιτύλιγμα του UIKit που εσωτερικά αποθηκεύει CGColor και προσθέτει υποστήριξη για διαφορές στη σκοτεινή λειτουργία (traitCollection). Το UIColor μπορεί να μετατραπεί σε CGColor μέσω της ιδιότητας .cgColor.

Γιατί πρέπει να καθορίζεται ο χρωματικός χώρος για το CGColor;

Ο χρωματικός χώρος καθορίζει πώς οι αριθμητικές συνιστώσες ερμηνεύονται ως ορατό χρώμα. Το ίδιο σύνολο αριθμών (1.0, 0.0, 0.0) σημαίνει κόκκινο σε RGB, αλλά κυανό σε CMYK. Χωρίς CGColorSpace, το Core Graphics δεν μπορεί να εμφανίσει σωστά το χρώμα σε μια συγκεκριμένη συσκευή με τα μοναδικά χαρακτηριστικά οθόνης της.

Ποιος χρωματικός χώρος χρησιμοποιείται προεπιλεγμένα στο iOS;

Σε iOS το γραφικό περιβάλλον UIView δημιουργείται προεπιλεγμένα με τον χρωματικό χώρο DeviceRGB. Σε συσκευές με οθόνη ευρείας χρωματικής γκάμας (iPad Pro 9,7 ιντσών και νεότερα, iPhone 7 και νεότερα) είναι επίσης διαθέσιμο το Display P3, το οποίο υποστηρίζει 25% περισσότερα χρώματα από το τυπικό sRGB.

Μπορούν να αλλάξουν οι συνιστώσες του CGColor μετά τη δημιουργία;

Όχι, το CGColor είναι ένα αμετάβλητο (immutable) αντικείμενο. Για να ληφθεί ένα χρώμα με διαφορετικές συνιστώσες, πρέπει να δημιουργηθεί ένα νέο CGColor μέσω CGColorCreate. Αυτό είναι σύμφωνο με τον σχεδιασμό του Core Graphics, όπου τα περισσότερα αντικείμενα είναι αμετάβλητα για την εξασφάλιση ασφάλειας νημάτων και προβλεψιμότητας σχεδίασης.

Πώς να μετατρέψω το CGColor από RGB σε CMYK;

Για μετατροπή, χρησιμοποιήστε CGColorCreateCopyByMatchingToColorSpace με τον χρωματικό χώρο CMYK-στόχο. Το Core Graphics θα εκτελέσει τη μετατροπή μέσω προφίλ ICC λαμβάνοντας υπόψη την πρόθεση απόδοσης. Επιλέξτε kCGRenderingIntentRelativeColorimetric για εκτύπωση ή kCGRenderingIntentPerceptual για φωτορεαλιστικές εικόνες.

Σύνοψη

  • CGColor — αμετάβλητο αντικείμενο χρώματος με συνιστώσες και αναφορά σε χρωματικό χώρο
  • CGColorSpace — καθορίζει το χρωματικό μοντέλο (RGB, Gray, CMYK) και το εύρος των αναπαραστάσιμων χρωμάτων
  • DeviceRGB — προεπιλεγμένος χρωματικός χώρος για γραφικό περιβάλλον iOS και macOS
  • Display P3 — χώρος ευρείας γκάμας για σύγχρονες συσκευές Apple με κάλυψη 25% μεγαλύτερη από το sRGB
  • Προφίλ ICC εξασφαλίζουν ακριβή μετατροπή χρωμάτων μεταξύ διαφορετικών συσκευών μέσω ColorSync
  • Κανάλι άλφα — προαιρετική συνιστώσα διαφάνειας που συμμετέχει στη σύνθεση Porter-Duff
  • Μετατροπή μεταξύ χώρων γίνεται αυτόματα κατά τη σχεδίαση ή ρητά μέσω CGColorCreateCopyByMatchingToColorSpace

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης