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 با در نظر گرفتن intent رندر انجام می‌دهد. برای چاپ kCGRenderingIntentRelativeColorimetric و برای تصاویر فوتورئالیستی kCGRenderingIntentPerceptual را انتخاب کنید.

خلاصه

  • CGColor — شیء رنگ تغییرناپذیر با مؤلفه‌ها و ارجاع به فضای رنگی
  • CGColorSpace — مدل رنگی (RGB, Gray, CMYK) و محدوده رنگ‌های قابل نمایش را تعریف می‌کند
  • DeviceRGB — فضای رنگی پیش‌فرض برای بافت گرافیکی iOS و macOS
  • Display P3 — فضای رنگی گسترده برای دستگاه‌های مدرن Apple با پوشش 25% بیشتر از sRGB
  • پروفایل‌های ICC تبدیل دقیق رنگ بین دستگاه‌های مختلف را از طریق ColorSync تضمین می‌کنند
  • کانال آلفا — مؤلفه اختیاری شفافیت که در ترکیب Porter-Duff شرکت می‌کند
  • تبدیل بین فضاها به طور خودکار هنگام رسم یا به صراحت از طریق CGColorCreateCopyByMatchingToColorSpace انجام می‌شود

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید