کار با رنگ در 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 با در نظر گرفتن intent رندر انجام میدهد. برای چاپ kCGRenderingIntentRelativeColorimetric و برای تصاویر فوتورئالیستی kCGRenderingIntentPerceptual را انتخاب کنید.
خلاصه
CGColorCreateCopyByMatchingToColorSpace انجام میشودما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید