CoreImage یک فریمورک اپل برای پردازش تصاویر و ویدئو در زمان واقعی است که دهها CIFilter داخلی برای تصحیح رنگ، تاری، اعمال بافت و تشخیص ارائه میدهد. به گفته Apple Documentation، CoreImage از GPU برای پردازش با کارایی بالای پیکسلها در دستگاههای iOS استفاده میکند. فریمورک از CIImage به عنوان یک شیء تصویر تغییرناپذیر و زنجیرههای فیلتر برای ترکیب افکتها بدون افت کیفیت پشتیبانی میکند.
نکات اصلی
CoreImage یک فریمورک اپل برای پردازش تصاویر شطرنجی و ویدئو است که اولین بار در macOS 10.4 Tiger معرفی و به iOS 5.0 منتقل شد. برخلاف Core Graphics یا UIKit، CoreImage در سطح شیدرهای پیکسلی کار میکند و از GPU برای محاسبات موازی استفاده میکند. این امکان اعمال افکتهای پیچیده — تاری، تصحیح رنگ، مورفینگ — را به تصاویر با وضوح مگاپیکسلی در میلیثانیه فراهم میکند.
معماری CoreImage بر مفهوم ارزیابی تنبل (lazy evaluation) ساخته شده است: CIFilter پردازش را تا لحظه رندر در CIContext انجام نمیدهد. توسعهدهنده زنجیرهای از چند CIFilter میسازد، خروجی یک فیلتر را به ورودی دیگری متصل میکند و تنها فراخوانی render خط لوله کامل GPU را راهاندازی میکند. این کار تعداد عبورها از کارت گرافیک را به حداقل میرساند و کارایی را حفظ میکند.
CoreImage از طیف رنگی گسترده (P3، sRGB، sRGB خطی)، تصاویر HDR و کار با فرمتهای پیکسل ۱۶ بیتی و ۳۲ بیتی پشتیبانی میکند. در دستگاههای دارای Neural Engine، CoreImage میتواند شیدرهای GPU را با Core ML برای پردازش هوشمند ترکیب کند — برای مثال، تصحیح خودکار رنگ مبتنی بر یادگیری ماشین، همانطور که در برنامه Photos در iOS 17 پیادهسازی شده است.
سه کلاس اصلی هسته CoreImage را تشکیل میدهند: CIImage (داده)، CIFilter (عملیات) و CIContext (محیط اجرا). هر کلاس مسئول فاز خود در خط لوله است و مسئولیتها را مخلوط نمیکند.
CIImage یک شیء سبکوزن است که تصویر را توصیف میکند اما مستقیماً دادههای پیکسلی ندارد. میتوان آن را از UIImage، CGImage، بافت Metal، بافت GL یا فایل روی دیسک ایجاد کرد. CIImage تغییرناپذیر است — هر اعمال فیلتر یک CIImage جدید بدون تغییر اصلی ایجاد میکند. این امکان ساخت زنجیرههای تبدیل بدون کپی داده بین مراحل را فراهم میکند.
ویژگی مهم: CIImage تا لحظه رندر به وضوح صفحه یا فضای رنگی وابسته نیست. میتوان همان CIImage را با پارامترهای مختلف به UIImage برای صفحه نمایش و به فایل TIFF برای چاپ رندر کرد — CoreImage به طور خودکار پردازش را با زمینه هدف تطبیق میدهد.
CIFilter کلاس اصلی برای اعمال افکتها است. هر CIFilter یک برنامه شیدر با پارامترهای ورودی (inputImage، inputIntensity، inputRadius و غیره) و یک تصویر خروجی است. اپل بیش از ۲۰۰ CIFilter داخلی ارائه میدهد که در دستهبندیها گروهبندی شدهاند: CICategoryColorEffect (تصحیح رنگ)، CICategoryBlur (تاری)، CICategoryStylize (سبکسازی)، CICategoryGeometryAdjust (تبدیلات هندسی).
برای ایجاد CIFilter سفارشی، توسعهدهنده یک شیدر Metal (CIKernel) مینویسد — یک شیدر قطعه به زبان Metal Shading Language که هر پیکسل را مستقل پردازش میکند. پس از کامپایل، شیدر به عنوان زیرکلاس CIFilter ثبت میشود و میتواند در زنجیرهها در کنار فیلترهای داخلی اپل استفاده شود.
| دستهبندی | نمونه فیلتر | کاربرد |
|---|---|---|
| ColorEffect | CIColorControls | روشنایی، کنتراست، اشباع |
| Blur | CIGaussianBlur | تاری گاوسی با شعاع قابل تنظیم |
| Stylize | CIPixellate | پیکسلسازی تصویر با مقیاس مشخص |
| GeometryAdjust | CIAffineTransform | چرخش، مقیاس، انتقال از طریق ماتریس affine |
| Composite | CISourceOverCompositing | ترکیب تصاویر با کانال آلفا |
CIContext یک شیء سنگین است که تخصیص منابع GPU، کامپایل شیدرها و بافرینگ را مدیریت میکند. ایجاد CIContext یک عملیات پرهزینه است، بنابراین اپل توصیه میکند آن را یک بار برای کل چرخه عمر برنامه ایجاد کرده و مجدداً استفاده کنید. زمینه به GPU خاص (Metal، OpenGL) یا CPU متصل است و فضای رنگی تصویر خروجی را تعیین میکند.
کتابخانه CIFilter دائماً در حال گسترش است: iOS 17 فیلترهای جدیدی برای پردازش HDR و یادگیری ماشین اضافه کرده است. همه فیلترهای داخلی در Apple Developer Documentation مستند شدهاند و میتوان آنها را بر اساس دستهبندی یا نام جستجو کرد. برای تشخیص فیلترهای موجود روی دستگاه از CIFilter.filterNames(inCategory:) استفاده کنید.
قابلیت اصلی CoreImage — ترکیب چند CIFilter در یک زنجیره. خروجی یک فیلتر از طریق پارامتر inputImage به ورودی فیلتر بعدی داده میشود. CoreImage زنجیره را در مرحله رندر بهینه میکند: فیلترهای مجاور که در یک فضای رنگی کار میکنند در یک عبور GPU (kernel fusion) ترکیب میشوند. این افزایش کارایی را بدون دخالت توسعهدهنده به همراه دارد.
برای ایجاد افکت اختصاصی، توسعهدهنده یک تابع Metal با حاشیهنویسی [[kernel]] مینویسد. تابع مختصات پیکسل را دریافت کرده و رنگ را برمیگرداند. CoreImage شیدر را به 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 میتواند شیدرهای کامپایل شده را مجدداً استفاده کند. برای حداکثر کارایی، از ایجاد CIContext برای هر فریم خودداری کنید — از یک زمینه استفاده کرده و پارامترهای ورودی فیلتر را دوباره تنظیم کنید.
CIDetector زیرسیستم CoreImage برای تشخیص اشیاء معنایی در تصویر بدون استفاده از Vision یا Core ML است. CIDetector از چهار نوع تشخیص پشتیبانی میکند: چهره (CIDetectorTypeFace)، متن (CIDetectorTypeText)، کدهای QR (CIDetectorTypeQRCode) و مستطیلها (CIDetectorTypeRectangle). تشخیصدهنده روی CPU با بهینهسازی برای دستورالعملهای NEON کار میکند که سرعت پایداری را در دستگاههای بدون GPU قدرتمند تضمین میکند.
تشخیصدهنده چهره CIDetectorTypeFace آرایهای از CIFaceFeature با مختصات مرزهای چهره، موقعیت چشمها و دهان برمیگرداند. از iOS 12، CIDetector همچنین لبخند (hasSmile) و موقعیت چشم چپ/راست (leftEyeClosed، rightEyeClosed) را تعیین میکند. دقت تشخیص برای اکثر برنامههای AR و عکس کافی است، اما برای سناریوهای حیاتی اپل Vision.framework را توصیه میکند.
CIDetectorTypeRectangle نواحی مستطیلی را در تصویر پیدا میکند — اسناد، کارتهای ویزیت، صفحه نمایش دستگاهها. تشخیصدهنده CIRectangleFeature با چهار نقطه تشکیل دهنده کانتور مستطیل برمیگرداند. به گفته WWDC 2024، تشخیصدهنده مستطیل از همان معماری شبکه عصبی Vision استفاده میکند اما با مصرف حافظه کمتر. این آن را برای پردازش جریان فریم در زمان واقعی، به عنوان مثال در برنامههای اسکنر اسناد، ترجیحپذیر میکند.
نمونههای عملی به تثبیت درک CoreImage کمک میکنند. دو سناریوی معمولی را بررسی میکنیم: اعمال فیلتر رنگی به عکس و تشخیص چهره با رسم کادر.
نمونه پایه فیلتر CISepiaTone که تصویر رنگی را به تنهای سپیا تبدیل میکند. فیلتر پارامتر inputIntensity را از ۰ (اصلی) تا ۱ (حداکثر اثر) میپذیرد. به ارزیابی تنبل توجه کنید: 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 تبدیل مختصات از طریق affine transform مورد نیاز است.
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 برای رسم برداری و زمینههای ۲ بعدی است. CoreImage برای پردازش انبوه تصاویر سریعتر است، Core Graphics برای رسم گامبهگام رابط دقیقتر است.
بله — CoreImage از پردازش فریمهای جداگانه ویدئو از طریق AVPlayerItemVideoOutput یا AVCaptureOutput پشتیبانی میکند. برای پردازش جریانی از AVVideoComposition with CIFilter استفاده کنید که اعمال افکتها را بدون کپی فریمها بین CPU و GPU امکانپذیر میسازد.
CoreImage به طور پیشفرض در فضای رنگی sRGB (kCGColorSpaceSRGB) کار میکند. هنگام ایجاد CIContext میتوان فضای جایگزین — extended linear sRGB برای HDR یا Display P3 برای نمایشگرهای با طیف گسترده — تعیین کرد.
محدودیتی برای تعداد فیلترها در زنجیره وجود ندارد، اما هر ۵–۷ فیلتر متوالی یک عبور GPU اضافی ایجاد میکند. برای بیش از ۱۰ فیلتر، توصیه میشود زنجیره را به گروهها تقسیم کرده و نتایج میانی را رندر کنید تا از تجاوز از حد ثباتهای شیدر جلوگیری شود.
بله — CIDetector روی CPU با استفاده از دستورالعملهای NEON در همه دستگاههای دارای iOS 5.0 و بالاتر کار میکند. دقت تشخیص در همه دستگاهها یکسان است، اما سرعت در چیپهای Apple A12+ به دلیل شتاب سختافزاری شبکههای عصبی بیشتر است.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید