Η εργασία με το χρώμα στο 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 που χρησιμοποιείται σε API τύπου C. Το 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, όπου τα περισσότερα αντικείμενα είναι αμετάβλητα για την εξασφάλιση ασφάλειας νημάτων και προβλεψιμότητας σχεδίασης.
Για μετατροπή, χρησιμοποιήστε CGColorCreateCopyByMatchingToColorSpace με τον χρωματικό χώρο CMYK-στόχο. Το Core Graphics θα εκτελέσει τη μετατροπή μέσω προφίλ ICC λαμβάνοντας υπόψη την πρόθεση απόδοσης. Επιλέξτε kCGRenderingIntentRelativeColorimetric για εκτύπωση ή kCGRenderingIntentPerceptual για φωτορεαλιστικές εικόνες.
Σύνοψη
CGColorCreateCopyByMatchingToColorSpaceΘα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης