CoreImage هو إطار عمل من Apple لمعالجة الصور والفيديو في الوقت الفعلي، ويوفر العشرات من CIFilter المدمجة لتصحيح الألوان والتمويه وتراكب القوام والكشف. وفقاً لـ توثيق Apple، يستخدم CoreImage وحدة معالجة الرسومات GPU للمعالجة عالية الأداء للبكسل على أجهزة iOS. الإطار يدعم CIImage ككائن صورة غير قابل للتغيير وسلاسل فلاتر لتأليف التأثيرات دون فقدان الجودة.
الخلاصة
CoreImage هو إطار عمل من Apple لمعالجة الصور النقطية والفيديو، تم تقديمه لأول مرة في macOS 10.4 Tiger وتم نقله إلى iOS 5.0. على عكس Core Graphics أو UIKit، يعمل CoreImage على مستوى shaders البكسل، باستخدام GPU للحسابات المتوازية. هذا يسمح بتطبيق تأثيرات معقدة — التمويه، تصحيح الألوان، التحول — على صور بدقة ميغابكسل في ميلي ثانية.
بنية CoreImage مبنية على مفهوم التقييم الكسول (lazy evaluation): CIFilter لا يقوم بالمعالجة حتى التقديم في CIContext. يبني المطور سلسلة من عدة CIFilter، واصلاً مخرج مرشح واحد إلى مدخل آخر، وفقط استدعاء render يطلق خط أنابيب GPU الكامل. هذا يقلل من عدد التمريرات عبر بطاقة الرسومات ويحافظ على الأداء.
يدعم CoreImage نطاق ألوان واسع (P3، sRGB، sRGB الخطي)، وصور HDR والعمل بتنسيقات بكسل 16 و32 بت. على الأجهزة المزودة بـ Neural Engine، يمكن لـ CoreImage الجمع بين shaders GPU وCore ML للمعالجة الذكية — على سبيل المثال، تصحيح الألوان التلقائي بناءً على التعلم الآلي، كما هو مطبق في تطبيق الصور على iOS 17.
ثلاث فئات رئيسية تشكل جوهر CoreImage: CIImage (البيانات)، CIFilter (العملية)، وCIContext (بيئة التنفيذ). كل فئة مسؤولة عن مرحلتها الخاصة في خط الأنابيب ولا تخلط المسؤوليات.
CIImage هو كائن خفيف يصف صورة ولكنه لا يحتوي على بيانات البكسل مباشرة. يمكن إنشاؤه من UIImage أو CGImage أو نسيج Metal أو نسيج GL أو ملف على القرص. CIImage غير قابل للتغيير — أي تطبيق لفلتر يخلق CIImage جديداً دون تعديل الأصل. هذا يسمح ببناء سلاسل تحويل دون نسخ البيانات بين الخطوات.
ميزة مهمة: CIImage غير مرتبط بدقة الشاشة أو فضاء الألوان حتى التقديم. يمكن تقديم نفس CIImage إلى UIImage للشاشة وإلى ملف TIFF للطباعة بمعايير مختلفة — يقوم CoreImage تلقائياً بتكييف المعالجة مع السياق الهدف.
CIFilter هي الفئة الرئيسية لتطبيق التأثيرات. كل CIFilter هو برنامج shader مع معاملات إدخال (inputImage، inputIntensity، inputRadius، إلخ) وصورة إخراج واحدة. توفر Apple أكثر من 200 CIFilter مدمجة، مجمعة حسب الفئات: CICategoryColorEffect (تصحيح الألوان)، CICategoryBlur (التمويه)، CICategoryStylize (التنميق)، CICategoryGeometryAdjust (التحويلات الهندسية).
لإنشاء CIFilter مخصص، يكتب المطور shader Metal (CIKernel) — shader أجزاء بلغة Metal Shading Language يعالج كل بكسل بشكل مستقل. بعد التجميع، يتم تسجيل shader كفئة فرعية من CIFilter ويمكن استخدامه في السلاسل جنباً إلى جنب مع فلاتر Apple المدمجة.
| الفئة | مثال فلتر | الغرض |
|---|---|---|
| ColorEffect | CIColorControls | السطوع، التباين، التشبع |
| Blur | CIGaussianBlur | تمويه غاوسي مع نصف قطر قابل للتعديل |
| Stylize | CIPixellate | تقسيم الصورة إلى بكسلات بمقياس محدد |
| GeometryAdjust | CIAffineTransform | تدوير، تحجيم، إزاحة عبر مصفوفة أفين |
| Composite | CISourceOverCompositing | تأليف الصور مع قناة ألفا |
CIContext هو كائن ثقيل يدير تخصيص موارد GPU وتجميع shaders والتخزين المؤقت. إنشاء CIContext هو عملية مكلفة، لذلك توصي Apple بإنشائه مرة واحدة طوال دورة حياة التطبيق وإعادة استخدامه. السياق مرتبط بـ GPU محدد (Metal، OpenGL) أو CPU ويحدد فضاء الألوان للصورة الناتجة.
مكتبة CIFilter تتوسع باستمرار: iOS 17 أضافت فلاتر جديدة لمعالجة HDR والتعلم الآلي. جميع الفلاتر المدمجة موثقة في توثيق مطوري Apple ويمكن البحث عنها حسب الفئات أو الأسماء. لاكتشاف الفلاتر المتاحة على الجهاز، استخدم CIFilter.filterNames(inCategory:).
القدرة الرئيسية لـ CoreImage هي تأليف عدة CIFilter في سلسلة. يتم تغذية مخرج فلتر واحد إلى مدخل آخر عبر معامل inputImage. يقوم CoreImage بتحسين السلسلة في مرحلة التقديم: يتم دمج الفلاتر المتجاورة التي تعمل في نفس فضاء الألوان في تمريرة GPU واحدة (kernel fusion). هذا يوفر كسباً في الأداء دون تدخل المطور.
لإنشاء تأثير مخصص، يكتب المطور دالة Metal بإضافة [[kernel]]. تستقبل الدالة إحداثيات البكسل وتعيد لوناً. يمرر CoreImage shader إلى GPU حيث يتم تنفيذه بالتوازي لجميع بكسلات الصورة. الفلاتر المخصصة مفيدة بشكل خاص للتأثيرات البصرية الفريدة: بني بمنحنى غير خطي، تمويه تشتت، أو محاكاة حبيبات الفيلم.
#include <CoreImage/CoreImage.h>
[[kernel]] float4 customFilter(sample_t s, float intensity) {
float4 result;
result.rgb = s.rgb * (1.0 - intensity) + s.r * intensity;
result.a = s.a;
return result;
}
CoreImage يدير تلقائياً ذاكرة التخزين المؤقت للنتائج الوسيطة. إذا تم تطبيق نفس سلسلة الفلاتر على صور مختلفة، يمكن لـ CoreImage إعادة استخدام shaders المترجمة. لأقصى أداء، تجنب إنشاء CIContext لكل إطار — استخدم سياقاً واحداً وأعد تعيين معاملات إدخال الفلتر.
CIDetector هو نظام فرعي من CoreImage لكشف الأشياء الدلالية في الصورة دون استخدام Vision أو Core ML. يدعم CIDetector أربعة أنواع من الكشف: الوجوه (CIDetectorTypeFace)، النص (CIDetectorTypeText)، رموز QR (CIDetectorTypeQRCode)، والمستطيلات (CIDetectorTypeRectangle). يعمل المكتشف على CPU مع تحسين لتعليمات NEON، مما يضمن سرعة ثابتة على الأجهزة بدون GPU قوي.
مكتشف الوجوه CIDetectorTypeFace يعيد مصفوفة من CIFaceFeature مع إحداثيات حدود الوجه ومواضع العينين والفم. منذ iOS 12، يكتشف CIDetector أيضاً الابتسامة (hasSmile) وموضع العين اليسرى/اليمنى (leftEyeClosed، rightEyeClosed). دقة الكشف كافية لمعظم تطبيقات AR والصور، ولكن للسيناريوهات الحرجة توصي Apple بـ Vision.framework.
CIDetectorTypeRectangle يجد المناطق المستطيلة في الصورة — المستندات، بطاقات العمل، شاشات الأجهزة. يعيد المكتشف CIRectangleFeature بأربع نقاط تشكل محيط المستطيل. وفقاً لـ WWDC 2024، يستخدم مكتشف المستطيلات نفس بنية الشبكة العصبية مثل Vision، ولكن باستهلاك ذاكرة أقل. وهذا يجعله مفضلاً لمعالجة تدفق الإطارات في الوقت الفعلي، على سبيل المثال، في تطبيقات ماسح المستندات.
أمثلة عملية ستساعد في ترسيخ فهم CoreImage. دعنا نلقي نظرة على سيناريوهين نموذجيين: تطبيق فلتر ألوان على صورة وكشف الوجوه مع رسم إطار محيط.
مثال أساسي لفلتر CISepiaTone، الذي يحول الصورة الملونة إلى درجات بنية. يقبل الفلتر معامل inputIntensity من 0 (أصلي) إلى 1 (أقصى تأثير). لاحظ التقييم الكسول: CIImage الذي يعيده filter.outputImage لا يحتوي على بكسلات — التقديم يحدث فقط عند استدعاء context.createCGImage.
import CoreImage
guard let inputImage = CIImage(image: uiImage) else { return }
let filter = CIFilter(name: "CISepiaTone")
filter?.setValue(inputImage, forKey: kCIInputImageKey)
filter?.setValue(0.8, forKey: kCIInputIntensityKey)
let context = CIContext()
let outputImage = filter?.outputImage
let cgImage = context.createCGImage(outputImage!, from: inputImage.extent)
let resultImage = UIImage(cgImage: cgImage!)
المثال التالي يستخدم CIDetector للبحث عن وجوه في الصورة ورسم مستطيل حول كل وجه تم اكتشافه. يحتوي CIFaceFeature على إحداثيات في نظام إحداثيات الصورة (الأصل في الزاوية السفلية اليسرى)، لذلك عند الرسم على UIKit، يلزم تحويل الإحداثيات عبر تحويل أفين.
let detector = CIDetector(
ofType: CIDetectorTypeFace,
context: context,
options: [CIDetectorAccuracy: CIDetectorAccuracyHigh]
)
let features = detector?.features(in: inputImage) as? [CIFaceFeature]
for face in features ?? [] {
print("Face bounds: \(face.bounds)")
if face.hasSmile {
print("الشخص يبتسم")
}
}
المثال الأخير يوضح سلسلة من ثلاثة فلاتر: تصحيح الألوان، التظليل، وتراكب النسيج. لاحظ أن outputImage للفلتر الأول يتم تمريره كـ inputImage للثاني — دون تقديم وسيط. عند استدعاء createCGImage، يجمع CoreImage العمليات الثلاث في تمريرة GPU واحدة.
let colorFilter = CIFilter(name: "CIColorControls")
colorFilter?.setValue(inputImage, forKey: kCIInputImageKey)
colorFilter?.setValues([
kCIInputBrightnessKey: 0.1,
kCIInputContrastKey: 1.2
])
let vignetteFilter = CIFilter(name: "CIVignette")
vignetteFilter?.setValue(colorFilter?.outputImage, forKey: kCIInputImageKey)
vignetteFilter?.setValue(2.0, forKey: "inputRadius")
let finalImage = vignetteFilter?.outputImage
let result = context.createCGImage(finalImage!, from: inputImage.extent)
الأسئلة المتكررة
CoreImage يعمل على GPU وهو محسّن لعمليات البكسل (الفلاتر، تصحيح الألوان)، بينما Core Graphics هي مكتبة CPU للرسم المتجهي وسياقات 2D. CoreImage أسرع للمعالجة الجماعية للصور، Core Graphics أكثر دقة للرسم التدريجي للواجهة.
نعم — يدعم CoreImage معالجة إطارات الفيديو الفردية عبر AVPlayerItemVideoOutput أو AVCaptureOutput. للمعالجة التدفقية، استخدم AVVideoComposition مع CIFilter، مما يسمح بتطبيق التأثيرات دون نسخ الإطارات بين CPU وGPU.
CoreImage افتراضياً يعمل في فضاء الألوان العامل sRGB (kCGColorSpaceSRGB). عند إنشاء CIContext، يمكن تحديد فضاء بديل — sRGB خطي ممتد لـ HDR أو Display P3 للشاشات ذات النطاق الواسع.
لا يوجد حد لعدد الفلاتر في السلسلة، لكن كل 5–7 فلاتر متتالية تنشئ تمريرة GPU إضافية. لأكثر من 10 فلاتر، يُنصح بتقسيم السلسلة إلى مجموعات وتقديم نتائج وسيطة لتجنب تجاوز حد سجلات shader.
نعم — يعمل CIDetector على CPU باستخدام تعليمات NEON على جميع الأجهزة التي تعمل بـ iOS 5.0 وما فوق. دقة الكشف هي نفسها على جميع الأجهزة، لكن السرعة أعلى على رقاقات Apple A12+ بسبب التسريع المادي للشبكات العصبية.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا