Photo Editing Extension হল একটি iOS প্রক্রিয়া যা থার্ড-পার্টি অ্যাপগুলিকে সিস্টেম ফটো অ্যাপে সরাসরি সম্পাদনা টুল যোগ করার অনুমতি দেয়। পূর্ণ-বৈশিষ্ট্যযুক্ত এডিটরের বিপরীতে, এক্সটেনশন ফটোটিকে আলাদা অ্যাপে লোড করে না — ব্যবহারকারী স্ট্যান্ডার্ড ইন্টারফেস থেকে বের না হয়ে ফিল্টার প্রয়োগ করে, রঙ সামঞ্জস্য করে বা ইফেক্ট যোগ করে। Apple Developer Documentation (2025) অনুসারে, PhotoKit ফটো রিসোর্স নিয়ে কাজ করার জন্য 40টিরও বেশি API প্রদান করে, যার মধ্যে PHAdjustmentData এবং PHContentEditingController অন্তর্ভুক্ত।
মূল বিষয়
Photo Editing Extension হল iOS-এ এক ধরনের অ্যাপ এক্সটেনশন যা ফটো অ্যাপের স্ট্যান্ডার্ড ইন্টারফেসে ছবি প্রক্রিয়াকরণ টুল এম্বেড করে। ব্যবহারকারী একটি ফটো খোলে, এডিট বাটনে চাপ দেয় এবং ইনস্টল করা এক্সটেনশনের তালিকা থেকে পছন্দসই এক্সটেনশন নির্বাচন করে। সম্পাদনার পরে, ফলাফল লাইব্রেরিতে ফিরে সংরক্ষিত হয় এবং মূল ফাইলটি পুনরুদ্ধারের জন্য উপলব্ধ থাকে।
এই আর্কিটেকচার ব্যবহারকারীর অভিজ্ঞতার একটি মূল সমস্যা সমাধান করে: অ্যাপের মধ্যে স্যুইচ করার, ছবি এক্সপোর্ট এবং ইম্পোর্ট করার বা সংস্করণ ট্র্যাক করার প্রয়োজন নেই। WWDC 2025 অনুসারে, সমস্ত এক্সটেনশন তাদের নিজস্ব স্যান্ডবক্স এবং সীমিত এক্সিকিউশন সময় — প্রতি সম্পাদনা অপারেশনে 30 সেকেন্ড পর্যন্ত — সহ একটি বিচ্ছিন্ন প্রক্রিয়ায় চলে।
এক্সটেনশনের ডিভাইস মেমরিতে ইচ্ছামত ফাইলগুলিতে অ্যাক্সেস নেই — শুধুমাত্র সেই ফটোতে যা ব্যবহারকারী নির্বাচন ইন্টারফেসের মাধ্যমে স্পষ্টভাবে পাস করেছে। এটি থার্ড-পার্টি টুল ব্যবহার করার সময় ব্যবহারকারীর ডেটার নিরাপত্তা নিশ্চিত করে।
PhotoKit হল ডিভাইস মিডিয়া লাইব্রেরির সাথে কাজ করার জন্য Apple-এর ফ্রেমওয়ার্ক, যা iOS 8-এ চালু হয়েছিল। এটি ফটো রিসোর্সে প্রোগ্রাম্যাটিক অ্যাক্সেস প্রদান করে, যার মধ্যে ছবি, ভিডিও, অ্যালবাম এবং মেটাডেটা অন্তর্ভুক্ত। সম্পাদনা এক্সটেনশনের জন্য, PhotoKit স্টোরেজ এবং পরিবর্তন ইন্টারফেসের মধ্যে একটি মধ্যবর্তী স্তর হিসেবে কাজ করে।
PHAsset লাইব্রেরিতে একটি পৃথক মিডিয়া অবজেক্ট উপস্থাপন করে — একটি ফটো বা ভিডিও। PHAsset-এর মাধ্যমে, আপনি মেটাডেটা পেতে পারেন: ক্যাপচারের তারিখ, ফাইলের ধরন, মানচিত্রে অবস্থান এবং ক্যামেরা ওরিয়েন্টেশন। PHAssetResource অন্তর্নিহিত রিসোর্সে অ্যাক্সেস প্রদান করে — উদাহরণস্বরূপ, RAW বা HEIC ফরম্যাটে মূল ফটো ফাইল।
একটি সম্পাদনা এক্সটেনশনের জন্য, PHContentEditingInput অত্যন্ত গুরুত্বপূর্ণ — একটি অবজেক্ট যা পড়া এবং প্রক্রিয়াকরণের জন্য উপলব্ধ সম্পূর্ণ ছবি (বা ভিডিও) ফাইল ধারণ করে। এক্সটেনশন সক্রিয়করণের সময় এই অবজেক্টটি গ্রহণ করে এবং এটি উৎস উপাদান হিসেবে ব্যবহার করে।
PHImageManager ছবি লোডিং এবং ক্যাশিং পরিচালনা করে। একটি সম্পাদনা এক্সটেনশনের জন্য, এটি সরাসরি ব্যবহার করা হয় না — এক্সটেনশন PHContentEditingInput-এর মাধ্যমে সম্পূর্ণ ফাইল গ্রহণ করে। তবে, PHImageRequestOptions আপনাকে রিকোয়েস্ট প্যারামিটার কনফিগার করতে দেয়: আকার, ডেলিভারি টাইপ (সিনক্রোনাস বা অ্যাসিনক্রোনাস) এবং ফলাফল ফরম্যাট।
Apple-এর মতে, PHImageManager স্বয়ংক্রিয়ভাবে RAM-তে ছবির থাম্বনেইল ক্যাশ করে, যা বারবার প্রিভিউ প্রদর্শন দ্রুততর করে। সম্পাদনা এক্সটেনশনের জন্য, সেরা ছবির গুণমান পেতে PHImageRequestOptionsDeliveryModeHighQualityFormat ব্যবহার করার পরামর্শ দেওয়া হয়।
let options = PHImageRequestOptions()
options.deliveryMode = .highQualityFormat
options.isSynchronous = true
PHImageManager.default().requestImage(
for: asset,
targetSize: .init(width: 1024, height: 1024),
contentMode: .aspectFill,
options: options
) { image, _ in
// use image for display
}
প্রতিটি Photo Editing Extension PHContentEditingController প্রোটোকল বাস্তবায়ন করে — এক্সটেনশনের কেন্দ্রীয় নিয়ন্ত্রণ উপাদান। প্রোটোকল ইন্টারফেস প্রদর্শন, ইনপুট ডেটা গ্রহণ এবং ফলাফল সংরক্ষণের জন্য পদ্ধতি নির্ধারণ করে।
beginContentEditing(with:) সম্পাদনা সেশন শুরু হলে কল করা হয়। এক্সটেনশন PHContentEditingInput গ্রহণ করে এবং মূল ছবি সহ ইন্টারফেস প্রদর্শন করতে হবে। finishContentEditing(completionHandler:) সম্পাদনা শেষ করে — এক্সটেনশন পরিবর্তিত ফাইল এবং AdjustmentData সহ PHContentEditingOutput ফেরত দেয়। cancelContentEditing() সংরক্ষণ না করেই পরিবর্তন বাতিল করে।
একটি গুরুত্বপূর্ণ সূক্ষ্মতা: beginContentEditing কলের সময়, এক্সটেনশন ফটোর শুধুমাত্র একটি সংস্করণে অ্যাক্সেস পায় — যেটি ব্যবহারকারী অনুরোধ করেছিল। এটি অন্য কোনো ফটো বা অ্যালবামে অ্যাক্সেস করতে পারে না। এটি Apple-এর নিরাপত্তার জন্য চালু করা স্যান্ডবক্স সীমাবদ্ধতা।
class PhotoEditingViewController: UIViewController {
override func beginContentEditing(
with input: PHContentEditingInput
) {
guard let url = input.fullSizeImageURL else { return }
let image = CIImage(contentsOf: url)
displayImage.image = UIImage(ciImage: image)
}
}
PHContentEditingController সম্পাদনা ইন্টারফেসকে সংরক্ষণ লজিক থেকে পৃথক করে। মূল iOS প্রক্রিয়া beginContentEditing কল করে, এক্সটেনশন তার UI দেখায়, ব্যবহারকারী পরিবর্তন করে, তারপর finishContentEditing একটি নতুন ফাইল তৈরি করে। Apple ইন্টারফেস ব্লক করা এড়াতে মূল থ্রেডের পরিবর্তে ব্যাকগ্রাউন্ড থ্রেডে সমস্ত রিসোর্স-নিবিড় প্রক্রিয়াকরণ — CIFilter ফিল্টার, Core Image অপারেশন — সম্পাদনের পরামর্শ দেয়।
PHAdjustmentData হল মূল প্রক্রিয়া যা Photo Editing Extension-এ অ-ধ্বংসাত্মক সম্পাদনা সক্ষম করে। এটি একটি অবজেক্ট যা ইচ্ছামত ফরম্যাটে প্রয়োগ করা পরিবর্তন সম্পর্কে তথ্য ধারণ করে। এক্সটেনশন ফিল্টার প্যারামিটার, মাস্ক এবং সেটিংস AdjustmentData-তে সিরিয়ালাইজ করে এবং পরিবর্তিত ছবির সাথে সংরক্ষণ করে।
ফটো পুনরায় খোলার সময়, এক্সটেনশন AdjustmentData পড়ে, পূর্ববর্তী ইন্টারফেস অবস্থা পুনরুদ্ধার করে এবং ব্যবহারকারীকে একই বিন্দু থেকে সম্পাদনা চালিয়ে যেতে দেয়। যদি এক্সটেনশন ইনস্টল না থাকে, তাহলে ফটোটি শেষ সংরক্ষিত সংস্করণে প্রদর্শিত হয়, যখন মূলটি আলাদাভাবে সংরক্ষণ করা হয়।
Apple ডকুমেন্টেশন অনুসারে, PHAdjustmentData formatIdentifier এবং formatVersion সংরক্ষণ করে — ডেটা ফরম্যাট শনাক্ত করার জন্য স্ট্রিং। এক্সটেনশন আপডেট করার সময়, আপনার সংস্করণ পরীক্ষা করা এবং পুরানো ফরম্যাটগুলি সঠিকভাবে পরিচালনা করা উচিত।
let adjustmentData = PHAdjustmentData(
formatIdentifier: "com.example.photoediting",
formatVersion: "1.0",
data: NSKeyedArchiver.archivedData(
withRootObject: params,
requiringSecureCoding: true
)
)
output.adjustmentData = adjustmentData
finishContentEditing-এর সময়, এক্সটেনশন পরিবর্তিত ছবি ফাইলের সাথে PHContentEditingOutput অবজেক্টে AdjustmentData লেখে। সিস্টেম তারপর উভয় উপাদান সংরক্ষণ করে: প্রদর্শনের জন্য সংস্করণ এবং সম্পাদনা সেশন পুনরুদ্ধারের জন্য মেটাডেটা।
Photo Editing Extension স্বয়ংক্রিয়ভাবে ফটো অ্যাপ মেনুতে উপস্থিত হয় এটি ধারণকারী অ্যাপ ইনস্টল করার পরে। ব্যবহারকারী একটি ফটো খোলে, এডিট নির্বাচন করে, এবং টুলের নিচের সারিতে সমস্ত ইনস্টল করা সম্পাদনা এক্সটেনশন — সিস্টেম এবং থার্ড-পার্টি উভয় — প্রদর্শিত হয়।
এক্সটেনশন মূল অ্যাপের Info.plist-এর মাধ্যমে NSExtensionActivationRule কী দিয়ে নিবন্ধিত হয়, যা নির্দিষ্ট করে কোন ধরনের কন্টেন্ট এক্সটেনশন সক্রিয় করে। একটি ফটো এডিটরের জন্য, ActivationRule সাধারণত image প্রয়োজন — এক্সটেনশন ভিডিও বা Live Photos-এর জন্য প্রদর্শিত হবে না।
Apple সম্পাদনা মেনু ওভারলোড না করার জন্য নির্দিষ্ট অ্যাক্টিভেশন টাইপ নির্দিষ্ট করার পরামর্শ দেয়। যদি এক্সটেনশন শুধুমাত্র JPEG এবং HEIC সমর্থন করে, তবে অ্যাক্টিভেশন এই ফরম্যাটগুলিতে সীমাবদ্ধ করা উচিত।
<!-- Info.plist -->
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.photo-editing</string>
<key>NSExtensionActivationRule</key>
<string>SUBQUERY (extensionItems,
@count <= 1)</string>
</dict>
এক্সটেনশন নির্বাচন করার পরে, iOS একটি কাস্টম UIViewController সহ একটি পৃথক প্রক্রিয়া তৈরি করে যা ফটো ইন্টারফেসের উপরে প্রদর্শিত হয়। ব্যবহারকারী তার ফটো, এক্সটেনশন টুল এবং বাতিল/সম্পন্ন বাটন দেখে। এক্সটেনশন তার নিজস্ব কন্ট্রোলারের বাইরে নেভিগেশন পরিবর্তন করতে বা সিস্টেমের অন্যান্য অংশে অ্যাক্সেস করতে পারে না।
Apple-এর Human Interface Guidelines অনুসারে, এক্সটেনশন ইন্টারফেস ন্যূনতম এবং কার্যকরী হওয়া উচিত — বিজ্ঞাপন, বহিরাগত লিঙ্ক বা অপ্রয়োজনীয় নেভিগেশন উপাদান ছাড়া। স্ক্রিন বিশৃঙ্খল না করার জন্য টুল প্যালেট প্রদর্শনের জন্য UIScrollView ব্যবহার করার পরামর্শ দেওয়া হয়।
সচরাচর জিজ্ঞাসিত প্রশ্ন
এক্সটেনশন beginContentEditing(with:) পদ্ধতির মাধ্যমে সম্পূর্ণ ছবি ফাইলের URL সহ PHContentEditingInput গ্রহণ করে। শুধুমাত্র একটি নির্বাচিত ফটোতে অ্যাক্সেস দেওয়া হয় — লাইব্রেরির অন্যান্য রিসোর্সে অধিকার ছাড়া।
না, মূল কখনো পরিবর্তিত হয় না। এক্সটেনশন PHContentEditingOutput-এর মাধ্যমে একটি নতুন সংস্করণ তৈরি করে, এবং AdjustmentData মূল অবস্থায় ফিরে যাওয়ার ক্ষমতার জন্য পরিবর্তন প্যারামিটার সংরক্ষণ করে।
এক্সটেনশন PhotoKit সমর্থন করে এমন সমস্ত ফরম্যাটের সাথে কাজ করে: JPEG, HEIC, RAW, PNG, TIFF এবং Live Photos। সীমাবদ্ধতা এক্সটেনশনের Info.plist-এ NSExtensionActivationRule-এর মাধ্যমে নির্ধারিত হয়।
iOS finishContentEditing অপারেশনের জন্য 30 সেকেন্ড পর্যন্ত বরাদ্দ করে। সীমা অতিক্রম করলে, এক্সটেনশন জোরপূর্বক বন্ধ হয় এবং পরিবর্তনগুলি সংরক্ষিত হয় না। CIFilter-এর সাথে ব্যাকগ্রাউন্ড প্রক্রিয়াকরণ এই সময় বাড়ায় না।
হ্যাঁ, Core Image (CIFilter) এবং Metal (কাস্টম শেডারের জন্য) সম্পূর্ণরূপে সমর্থিত। Apple Grand Central Dispatch-এর মাধ্যমে ভারী গণনা ব্যাকগ্রাউন্ড থ্রেডে স্থানান্তর করার পরামর্শ দেয়।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন