CGColor وCGColorSpace: ما هي، نماذج الألوان وكيفية إدارتها

المؤلف: IT Sectr نُشر: 2026-07-21 وقت القراءة: 9 دق

العمل مع الألوان في Core Graphics يبنى حول كيانين مترابطين — CGColor وCGColorSpace. يمثل CGColor لونًا محددًا بمكوناته، بينما يحدد CGColorSpace نموذج تفسير هذه المكونات. وفقًا لوثائق Apple (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 تعني سماوي.

CGColorSpace هو كائن يحدد نموذج اللون ونطاق القيم القابلة للتمثيل (gamut). تحدد المساحة اللونية القواعد التي تتحول بها المكونات الرقمية إلى لون مرئي على جهاز إخراج محدد. يدعم Core Graphics كلاً من المساحات القياسية المعتمدة على ICC والمساحات المخصصة التي يتم إنشاؤها عبر CGColorSpace مع جداول تحويل مخصصة.

الهندسة المعمارية التي تفصل اللون عن المساحة اللونية هي ميزة رئيسية لـ Core Graphics تميزها عن واجهات API حيث يتم تخزين اللون كمجموعة بسيطة من الأرقام. يسمح هذا النهج لـ Core Graphics بإجراء إدارة ألوان مستقلة عن الجهاز: يمكن عرض نفس كائن CGColor بشكل صحيح على شاشات مختلفة بفضل التحويل التلقائي للمكونات عبر ملف تعريف CGColorSpace.

كيف تعمل الألوان في Core Graphics

Core Graphics يطبق اللون من خلال نموذج قائم على ملفات تعريف ICC (الاتحاد الدولي للألوان). يحتوي كل 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
RGBأحمر، أخضر، أزرقالشاشات، رسومات iOS/macOSkCGColorSpaceSRGB
Grayأبيض (قناة واحدة)رسومات أبيض وأسود، ظلالkCGColorSpaceGenericGray
CMYKسماوي، أرجواني، أصفر، أسودالمنتجات المطبوعة، PDFkCGColorSpaceGenericCMYK
Display P3R، G، B (نطاق واسع)أجهزة iOS الحديثةkCGColorSpaceDisplayP3

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. يعتمد عدد المكونات على نموذج اللون: 1 لـ Gray، 3 لـ RGB، 4 لـ CMYK. بعد الإنشاء، CGColor هو كائن غير قابل للتغيير (immutable) — لا يمكن تغيير مكوناته، فقط إنشاء لون جديد.

يوفر Core Graphics أيضًا دوال CGColorCreateGenericRGB وCGColorCreateGenericGray وCGColorCreateGenericCMYK لإنشاء ألوان في مساحات لونية قياسية (عامة). تبسط هذه الدوال الكود بإلغاء الحاجة إلى إنشاء 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 غير قابل للتغيير وآمن للخيوط — يمكن استخدام نفس الكائن في سياقات رسومية متعددة.

الحصول على CGColorSpace الأساسية

Core Graphics يوفر العديد من المساحات اللونية المحددة مسبقًا عبر ثوابت مسماة: kCGColorSpaceSRGB وkCGColorSpaceDisplayP3 وkCGColorSpaceGenericGrayGamma2_2. تُمرر هذه الثوابت إلى CGColorSpaceCreateWithName. لأجهزة iOS ذات النطاق اللوني الواسع، يُوصى باستخدام Display P3، حيث أن sRGB قد لا تستخدم بالكامل إمكانيات الشاشة.

ملفات تعريف ICC وCGColorSpace مخصصة

ملفات تعريف ICC هي ملفات موحدة تصف الخصائص اللونية للجهاز. يسمح Core Graphics بإنشاء CGColorSpace بناءً على ملف تعريف ICC عشوائي عبر CGColorSpaceCreateWithICCProfile. يُستخدم هذا في التطبيقات المهنية لطباعة الصور وما قبل الطباعة حيث تتطلب مطابقة دقيقة لطابعة أو شاشة معينة.

التحويل بين المساحات اللونية

Core Graphics يقوم بالتحويل بين المساحات اللونية تلقائيًا أثناء العرض عبر دالتي CGContextSetFillColorWithColor أو CGContextSetStrokeColorWithColor. إذا كانت مساحة لون السياق الرسومي تختلف عن مساحة لون CGColor المُمرر، يقوم Quartz 2D بإجراء التحويل باستخدام ملفات تعريف ICC لكلتا المساحتين.

للتحويل الصريح للون، استخدم CGColorCreateCopyByMatchingToColorSpace — دالة تنشئ CGColor جديدًا يتم إعادة حساب مكوناته من المساحة المصدر إلى المساحة الهدف. وفقًا لملاحظة Apple التقنية 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. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا