CoreImage: چیست، فیلترها و کار با تصاویر

نویسنده: IT Sectr منتشر شده: 2026-05-06 زمان مطالعه: 9 دقیقه

CoreImage یک فریمورک اپل برای پردازش تصاویر و ویدئو در زمان واقعی است که ده‌ها CIFilter داخلی برای تصحیح رنگ، تاری، اعمال بافت و تشخیص ارائه می‌دهد. به گفته Apple Documentation، CoreImage از GPU برای پردازش با کارایی بالای پیکسل‌ها در دستگاه‌های iOS استفاده می‌کند. فریمورک از CIImage به عنوان یک شیء تصویر تغییرناپذیر و زنجیره‌های فیلتر برای ترکیب افکت‌ها بدون افت کیفیت پشتیبانی می‌کند.

نکات اصلی

  • CoreImage — فریمورک اپل برای پردازش تصاویر و ویدئو با شتاب GPU در iOS و macOS
  • CIFilter — بلوک ساختمانی پایه با بیش از ۲۰۰ افکت داخلی و پشتیبانی از شیدرهای سفارشی Metal
  • CIImage — شیء تغییرناپذیر که تصویر را در خط لوله CoreImage بدون وابستگی به فرمت خاص نمایش می‌دهد
  • CIDetector — مؤلفه‌ای برای تشخیص چهره، متن، کدهای QR و مستطیل‌ها در تصویر
  • پردازش GPU — CoreImage به طور خودکار از Metal یا OpenGL برای محاسبات موازی روی GPU استفاده می‌کند

CoreImage چیست

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

سه کلاس اصلی هسته CoreImage را تشکیل می‌دهند: CIImage (داده)، CIFilter (عملیات) و CIContext (محیط اجرا). هر کلاس مسئول فاز خود در خط لوله است و مسئولیت‌ها را مخلوط نمی‌کند.

CIImage — منبع تغییرناپذیر

CIImage یک شیء سبک‌وزن است که تصویر را توصیف می‌کند اما مستقیماً داده‌های پیکسلی ندارد. می‌توان آن را از UIImage، CGImage، بافت Metal، بافت GL یا فایل روی دیسک ایجاد کرد. CIImage تغییرناپذیر است — هر اعمال فیلتر یک CIImage جدید بدون تغییر اصلی ایجاد می‌کند. این امکان ساخت زنجیره‌های تبدیل بدون کپی داده بین مراحل را فراهم می‌کند.

ویژگی مهم: CIImage تا لحظه رندر به وضوح صفحه یا فضای رنگی وابسته نیست. می‌توان همان CIImage را با پارامترهای مختلف به UIImage برای صفحه نمایش و به فایل TIFF برای چاپ رندر کرد — CoreImage به طور خودکار پردازش را با زمینه هدف تطبیق می‌دهد.

CIFilter — عملیات پردازش

CIFilter کلاس اصلی برای اعمال افکت‌ها است. هر CIFilter یک برنامه شیدر با پارامترهای ورودی (inputImage، inputIntensity، inputRadius و غیره) و یک تصویر خروجی است. اپل بیش از ۲۰۰ CIFilter داخلی ارائه می‌دهد که در دسته‌بندی‌ها گروه‌بندی شده‌اند: CICategoryColorEffect (تصحیح رنگ)، CICategoryBlur (تاری)، CICategoryStylize (سبک‌سازی)، CICategoryGeometryAdjust (تبدیلات هندسی).

برای ایجاد CIFilter سفارشی، توسعه‌دهنده یک شیدر Metal (CIKernel) می‌نویسد — یک شیدر قطعه به زبان Metal Shading Language که هر پیکسل را مستقل پردازش می‌کند. پس از کامپایل، شیدر به عنوان زیرکلاس CIFilter ثبت می‌شود و می‌تواند در زنجیره‌ها در کنار فیلترهای داخلی اپل استفاده شود.

دسته‌بندینمونه فیلترکاربرد
ColorEffectCIColorControlsروشنایی، کنتراست، اشباع
BlurCIGaussianBlurتاری گاوسی با شعاع قابل تنظیم
StylizeCIPixellateپیکسل‌سازی تصویر با مقیاس مشخص
GeometryAdjustCIAffineTransformچرخش، مقیاس، انتقال از طریق ماتریس affine
CompositeCISourceOverCompositingترکیب تصاویر با کانال آلفا

CIContext — محیط رندر

CIContext یک شیء سنگین است که تخصیص منابع GPU، کامپایل شیدرها و بافرینگ را مدیریت می‌کند. ایجاد CIContext یک عملیات پرهزینه است، بنابراین اپل توصیه می‌کند آن را یک بار برای کل چرخه عمر برنامه ایجاد کرده و مجدداً استفاده کنید. زمینه به GPU خاص (Metal، OpenGL) یا CPU متصل است و فضای رنگی تصویر خروجی را تعیین می‌کند.

CIFilter: فیلترهای داخلی و شیدرهای سفارشی Metal

کتابخانه CIFilter دائماً در حال گسترش است: iOS 17 فیلترهای جدیدی برای پردازش HDR و یادگیری ماشین اضافه کرده است. همه فیلترهای داخلی در Apple Developer Documentation مستند شده‌اند و می‌توان آنها را بر اساس دسته‌بندی یا نام جستجو کرد. برای تشخیص فیلترهای موجود روی دستگاه از CIFilter.filterNames(inCategory:) استفاده کنید.

زنجیره چند فیلتر

قابلیت اصلی CoreImage — ترکیب چند CIFilter در یک زنجیره. خروجی یک فیلتر از طریق پارامتر inputImage به ورودی فیلتر بعدی داده می‌شود. CoreImage زنجیره را در مرحله رندر بهینه می‌کند: فیلترهای مجاور که در یک فضای رنگی کار می‌کنند در یک عبور GPU (kernel fusion) ترکیب می‌شوند. این افزایش کارایی را بدون دخالت توسعه‌دهنده به همراه دارد.

فیلترهای سفارشی از طریق CIKernel

برای ایجاد افکت اختصاصی، توسعه‌دهنده یک تابع Metal با حاشیه‌نویسی [[kernel]] می‌نویسد. تابع مختصات پیکسل را دریافت کرده و رنگ را برمی‌گرداند. CoreImage شیدر را به GPU ارسال می‌کند، جایی که به صورت موازی برای همه پیکسل‌های تصویر اجرا می‌شود. فیلترهای سفارشی به ویژه برای افکت‌های بصری منحصر به فرد مفید هستند: سپیا با منحنی غیرخطی، تاری پراکندگی یا تقلید دانه فیلم.

metal
#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: تشخیص چهره، متن و اشیاء

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 استفاده می‌کند اما با مصرف حافظه کمتر. این آن را برای پردازش جریان فریم در زمان واقعی، به عنوان مثال در برنامه‌های اسکنر اسناد، ترجیح‌پذیر می‌کند.

نمونه کد: فیلترها و تشخیص در Swift

نمونه‌های عملی به تثبیت درک CoreImage کمک می‌کنند. دو سناریوی معمولی را بررسی می‌کنیم: اعمال فیلتر رنگی به عکس و تشخیص چهره با رسم کادر.

اعمال سپیا به تصویر

نمونه پایه فیلتر CISepiaTone که تصویر رنگی را به تن‌های سپیا تبدیل می‌کند. فیلتر پارامتر inputIntensity را از ۰ (اصلی) تا ۱ (حداکثر اثر) می‌پذیرد. به ارزیابی تنبل توجه کنید: CIImage برگردانده شده توسط filter.outputImage حاوی پیکسل نیست — رندر فقط هنگام فراخوانی context.createCGImage انجام می‌شود.

swift
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 مورد نیاز است.

swift
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 ترکیب می‌کند.

swift
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 چه تفاوتی با Core Graphics دارد؟

CoreImage روی GPU کار می‌کند و برای عملیات پیکسلی (فیلترها، تصحیح رنگ) بهینه شده است، در حالی که Core Graphics یک کتابخانه CPU برای رسم برداری و زمینه‌های ۲ بعدی است. CoreImage برای پردازش انبوه تصاویر سریع‌تر است، Core Graphics برای رسم گام‌به‌گام رابط دقیق‌تر است.

آیا می‌توان CoreImage را به ویدئوی زنده اعمال کرد؟

بله — CoreImage از پردازش فریم‌های جداگانه ویدئو از طریق AVPlayerItemVideoOutput یا AVCaptureOutput پشتیبانی می‌کند. برای پردازش جریانی از AVVideoComposition with CIFilter استفاده کنید که اعمال افکت‌ها را بدون کپی فریم‌ها بین CPU و GPU امکان‌پذیر می‌سازد.

CoreImage به طور پیش‌فرض از چه پروفایل رنگی استفاده می‌کند؟

CoreImage به طور پیش‌فرض در فضای رنگی sRGB (kCGColorSpaceSRGB) کار می‌کند. هنگام ایجاد CIContext می‌توان فضای جایگزین — extended linear sRGB برای HDR یا Display P3 برای نمایشگرهای با طیف گسترده — تعیین کرد.

چند فیلتر CIFilter را می‌توان در یک زنجیره ترکیب کرد؟

محدودیتی برای تعداد فیلترها در زنجیره وجود ندارد، اما هر ۵–۷ فیلتر متوالی یک عبور GPU اضافی ایجاد می‌کند. برای بیش از ۱۰ فیلتر، توصیه می‌شود زنجیره را به گروه‌ها تقسیم کرده و نتایج میانی را رندر کنید تا از تجاوز از حد ثبات‌های شیدر جلوگیری شود.

آیا CIDetector روی دستگاه‌های بدون Neural Engine کار می‌کند؟

بله — CIDetector روی CPU با استفاده از دستورالعمل‌های NEON در همه دستگاه‌های دارای iOS 5.0 و بالاتر کار می‌کند. دقت تشخیص در همه دستگاه‌ها یکسان است، اما سرعت در چیپ‌های Apple A12+ به دلیل شتاب سخت‌افزاری شبکه‌های عصبی بیشتر است.

خلاصه

  • CoreImage — فریمورک اپل با شتاب GPU برای پردازش تصاویر و ویدئو در iOS و macOS
  • CIImage، CIFilter و CIContext معماری سه لایه با ارزیابی تنبل تشکیل می‌دهند
  • بیش از ۲۰۰ CIFilter داخلی بیشتر وظایف تصحیح رنگ، تاری و سبک‌سازی را پوشش می‌دهند
  • فیلترهای سفارشی از طریق Metal CIKernel با حاشیه‌نویسی [[kernel]] ایجاد می‌شوند
  • CIDetector چهره، متن، کدهای QR و مستطیل‌ها را بدون نیاز به Vision.framework پیدا می‌کند
  • زنجیره‌های فیلتر به طور خودکار از طریق kernel fusion در یک عبور GPU بهینه می‌شوند
  • برای پردازش ویدئو در زمان واقعی از AVVideoComposition با CIFilter استفاده کنید

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

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

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

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