CoreImage হলো Apple-এর রিয়েল-টাইম ইমেজ এবং ভিডিও প্রসেসিং ফ্রেমওয়ার্ক, যা কালার কারেকশন, ব্লার, টেক্সচার ওভারলে এবং ডিটেকশনের জন্য ডজনখানেক বিল্ট-ইন CIFilter প্রদান করে। Apple ডকুমেন্টেশন অনুযায়ী, CoreImage iOS ডিভাইসে উচ্চ-কার্যক্ষমতা সম্পন্ন পিক্সেল প্রসেসিংয়ের জন্য GPU ব্যবহার করে। ফ্রেমওয়ার্কটি CIImage-কে একটি অপরিবর্তনীয় ইমেজ অবজেক্ট এবং গুণগত মান হ্রাস ছাড়াই ইফেক্ট কম্পোজিশনের জন্য ফিল্টার চেইন সমর্থন করে।
মূল বিষয়
CoreImage হলো রাস্টার ইমেজ এবং ভিডিও প্রসেসিংয়ের জন্য Apple ফ্রেমওয়ার্ক, প্রথম 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-এর সাথে একত্রিত করতে পারে — যেমন, মেশিন লার্নিং-ভিত্তিক স্বয়ংক্রিয় কালার কারেকশন, যা iOS 17-এর ফটো অ্যাপে বাস্তবায়িত।
তিনটি প্রধান ক্লাস CoreImage-এর মূল গঠন করে: CIImage (ডেটা), CIFilter (অপারেশন) এবং CIContext (এক্সিকিউশন এনভায়রনমেন্ট)। প্রতিটি ক্লাস তার নিজস্ব পাইপলাইন পর্যায়ের জন্য দায়ী এবং দায়িত্ব মিশ্রিত করে না।
CIImage একটি হালকা অবজেক্ট যা একটি ছবি বর্ণনা করে কিন্তু সরাসরি পিক্সেল ডেটা ধারণ করে না। এটি UIImage, CGImage, Metal টেক্সচার, GL টেক্সচার বা ডিস্কের ফাইল থেকে তৈরি করা যেতে পারে। CIImage অপরিবর্তনীয় — যেকোনো ফিল্টার প্রয়োগ মূলটি পরিবর্তন না করেই একটি নতুন CIImage তৈরি করে। এটি ধাপগুলোর মধ্যে ডেটা কপি না করেই রূপান্তর চেইন তৈরি করতে সক্ষম করে।
একটি গুরুত্বপূর্ণ বৈশিষ্ট্য: CIImage রেন্ডারিং পর্যন্ত স্ক্রিন রেজোলিউশন বা কালার স্পেসের সাথে আবদ্ধ নয়। একই CIImage-কে স্ক্রিনের জন্য UIImage এবং ভিন্ন প্যারামিটার সহ প্রিন্টিংয়ের জন্য TIFF ফাইলে রেন্ডার করা যেতে পারে — CoreImage স্বয়ংক্রিয়ভাবে লক্ষ্য প্রসঙ্গের সাথে প্রসেসিং খাপ খাইয়ে নেয়।
CIFilter ইফেক্ট প্রয়োগের প্রধান ক্লাস। প্রতিটি CIFilter ইনপুট প্যারামিটার (inputImage, inputIntensity, inputRadius, ইত্যাদি) এবং একটি আউটপুট ইমেজসহ একটি শেডার প্রোগ্রাম। Apple ২০০-এর বেশি বিল্ট-ইন CIFilter সরবরাহ করে, যা বিভাগ অনুসারে গোষ্ঠীবদ্ধ: CICategoryColorEffect (কালার কারেকশন), CICategoryBlur (ব্লার), CICategoryStylize (স্টাইলাইজেশন), CICategoryGeometryAdjust (জ্যামিতিক রূপান্তর)।
কাস্টম CIFilter তৈরি করতে, ডেভেলপার একটি Metal শেডার (CIKernel) লেখেন — Metal Shading Language-এ একটি ফ্র্যাগমেন্ট শেডার যা প্রতিটি পিক্সেল স্বাধীনভাবে প্রসেস করে। কম্পাইলেশনের পর, শেডারটি CIFilter সাবক্লাস হিসেবে নিবন্ধিত হয় এবং Apple-এর বিল্ট-ইন ফিল্টারের সাথে চেইনে ব্যবহার করা যেতে পারে।
| বিভাগ | ফিল্টার উদাহরণ | উদ্দেশ্য |
|---|---|---|
| ColorEffect | CIColorControls | উজ্জ্বলতা, কন্ট্রাস্ট, স্যাচুরেশন |
| Blur | CIGaussianBlur | সামঞ্জস্যযোগ্য ব্যাসার্ধসহ গাউসিয়ান ব্লার |
| Stylize | CIPixellate | নির্দিষ্ট স্কেলে পিক্সেলেশন |
| GeometryAdjust | CIAffineTransform | অ্যাফিন ম্যাট্রিক্সের মাধ্যমে ঘূর্ণন, স্কেল, অনুবাদ |
| Composite | CISourceOverCompositing | আলফা চ্যানেলসহ ইমেজ কম্পোজিটিং |
CIContext একটি ভারী অবজেক্ট যা GPU সম্পদ বরাদ্দ, শেডার কম্পাইলেশন এবং বাফারিং পরিচালনা করে। CIContext তৈরি করা একটি ব্যয়বহুল অপারেশন, তাই Apple অ্যাপ্লিকেশন লাইফসাইকেলে এটি একবার তৈরি করে পুনরায় ব্যবহার করার সুপারিশ করে। কনটেক্সটটি একটি নির্দিষ্ট GPU (Metal, OpenGL) বা CPU-র সাথে আবদ্ধ এবং আউটপুট ইমেজের কালার স্পেস নির্ধারণ করে।
CIFilter লাইব্রেরি ক্রমাগত প্রসারিত হচ্ছে: iOS 17 HDR প্রসেসিং এবং মেশিন লার্নিংয়ের জন্য নতুন ফিল্টার যুক্ত করেছে। সমস্ত বিল্ট-ইন ফিল্টার Apple ডেভেলপার ডকুমেন্টেশনে নথিভুক্ত এবং বিভাগ বা নাম অনুসারে অনুসন্ধান করা যেতে পারে। ডিভাইসে উপলব্ধ ফিল্টার আবিষ্কার করতে CIFilter.filterNames(inCategory:) ব্যবহার করুন।
CoreImage-এর প্রধান ক্ষমতা হলো একাধিক CIFilter-কে একটি চেইনে কম্পোজ করা। একটি ফিল্টারের আউটপুট inputImage প্যারামিটারের মাধ্যমে অন্যটির ইনপুটে দেওয়া হয়। CoreImage রেন্ডারিং পর্যায়ে চেইনটি অপ্টিমাইজ করে: একই কালার স্পেসে কাজ করা সংলগ্ন ফিল্টারগুলি একটি একক GPU পাসে (kernel fusion) একত্রিত হয়। এটি ডেভেলপারের হস্তক্ষেপ ছাড়াই কর্মক্ষমতা লাভ প্রদান করে।
কাস্টম ইফেক্ট তৈরি করতে, ডেভেলপার [[kernel]] অ্যানোটেশনসহ একটি Metal ফাংশন লেখে। ফাংশনটি পিক্সেল স্থানাঙ্ক গ্রহণ করে এবং একটি রঙ ফেরত দেয়। 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 Vision বা Core ML ব্যবহার না করেই ইমেজে সিম্যান্টিক অবজেক্ট শনাক্ত করার জন্য CoreImage উপপ্রণালী। CIDetector চার ধরনের ডিটেকশন সমর্থন করে: মুখ (CIDetectorTypeFace), টেক্সট (CIDetectorTypeText), QR কোড (CIDetectorTypeQRCode) এবং আয়তক্ষেত্র (CIDetectorTypeRectangle)। ডিটেক্টরটি NEON নির্দেশের জন্য অপ্টিমাইজেশনসহ CPU-তে কাজ করে, যা শক্তিশালী GPU ছাড়া ডিভাইসে স্থিতিশীল গতি নিশ্চিত করে।
মুখ ডিটেক্টর CIDetectorTypeFace মুখের সীমানা স্থানাঙ্ক, চোখ এবং মুখের অবস্থানসহ CIFaceFeature-এর একটি অ্যারে ফেরত দেয়। iOS 12 থেকে, CIDetector হাসি (hasSmile) এবং বাম/ডান চোখের অবস্থান (leftEyeClosed, rightEyeClosed)-ও শনাক্ত করে। ডিটেকশন নির্ভুলতা অধিকাংশ AR এবং ফটো অ্যাপ্লিকেশনের জন্য যথেষ্ট, কিন্তু গুরুত্বপূর্ণ পরিস্থিতিতে Apple Vision.framework সুপারিশ করে।
CIDetectorTypeRectangle ইমেজে আয়তক্ষেত্রাকার এলাকা খুঁজে পায় — ডকুমেন্ট, বিজনেস কার্ড, ডিভাইস স্ক্রিন। ডিটেক্টর চারটি বিন্দুসহ CIRectangleFeature ফেরত দেয় যা আয়তক্ষেত্রের কনট্যুর গঠন করে। WWDC 2024 অনুযায়ী, আয়তক্ষেত্র ডিটেক্টর Vision-এর মতোই নিউরাল নেটওয়ার্ক আর্কিটেকচার ব্যবহার করে, কিন্তু কম মেমরি খরচসহ। এটি রিয়েল-টাইম ফ্রেম স্ট্রিম প্রসেসিংয়ের জন্য এটিকে পছন্দনীয় করে, যেমন ডকুমেন্ট স্ক্যানার অ্যাপ্লিকেশনে।
ব্যবহারিক উদাহরণ CoreImage-এর বোঝাপড়া মজবুত করতে সাহায্য করবে। আসুন দুটি সাধারণ পরিস্থিতি দেখি: একটি ফটোতে কালার ফিল্টার প্রয়োগ এবং বাউন্ডিং বক্স আঁকার সাথে মুখ শনাক্তকরণ।
CISepiaTone ফিল্টারের একটি মৌলিক উদাহরণ, যা রঙিন ছবিকে সেপিয়া টোনে রূপান্তর করে। ফিল্টারটি inputIntensity প্যারামিটার 0 (মূল) থেকে 1 (সর্বোচ্চ ইফেক্ট) পর্যন্ত গ্রহণ করে। অলস মূল্যায়ন লক্ষ্য করুন: filter.outputImage দ্বারা ফেরত দেওয়া CIImage পিক্সেল ধারণ করে না — রেন্ডারিং শুধুমাত্র 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 ভেক্টর ড্রইং এবং 2D কনটেক্সটের জন্য CPU লাইব্রেরি। CoreImage ব্যাচ ইমেজ প্রসেসিংয়ে দ্রুততর, Core Graphics ধাপে ধাপে ইন্টারফেস ড্রইংয়ে বেশি নির্ভুল।
হ্যাঁ — CoreImage AVPlayerItemVideoOutput বা AVCaptureOutput-এর মাধ্যমে পৃথক ভিডিও ফ্রেম প্রসেসিং সমর্থন করে। স্ট্রিমিং প্রসেসিংয়ের জন্য CIFilter-সহ AVVideoComposition ব্যবহার করুন, যা CPU এবং GPU-র মধ্যে ফ্রেম কপি না করেই ইফেক্ট প্রয়োগ করতে দেয়।
CoreImage ডিফল্টভাবে sRGB ওয়ার্কিং কালার স্পেসে (kCGColorSpaceSRGB) কাজ করে। CIContext তৈরি করার সময়, আপনি একটি বিকল্প স্পেস নির্দিষ্ট করতে পারেন — HDR-এর জন্য এক্সটেন্ডেড লিনিয়ার sRGB বা ওয়াইড-গ্যামুট ডিসপ্লের জন্য Display P3।
কোনো সীমা নেই একটি চেইনে ফিল্টারের সংখ্যার, কিন্তু প্রতি ৫–7টি ধারাবাহিক ফিল্টার একটি অতিরিক্ত GPU পাস তৈরি করে। ১০টির বেশি ফিল্টারের জন্য, চেইনটিকে গ্রুপে ভাগ করে মধ্যবর্তী ফলাফল রেন্ডার করার সুপারিশ করা হয় যাতে শেডার রেজিস্টার সীমা অতিক্রম না হয়।
হ্যাঁ — CIDetector iOS 5.0 এবং তার উপরের সকল ডিভাইসে NEON নির্দেশ ব্যবহার করে CPU-তে কাজ করে। ডিটেকশন নির্ভুলতা সকল ডিভাইসে একই, কিন্তু Apple A12+ চিপে হার্ডওয়্যার-ত্বরিত নিউরাল নেটওয়ার্কের কারণে গতি বেশি।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন