PhotoKit হল iOS এবং macOS-এ মিডিয়া লাইব্রেরির সাথে কাজ করার জন্য Apple-এর ফ্রেমওয়ার্ক, যা ডিভাইসে ফটো, ভিডিও এবং Live Photos-এ সরাসরি অ্যাক্সেস প্রদান করে। Apple-এর ডকুমেন্টেশন অনুসারে, ফ্রেমওয়ার্কটি পুরনো AssetsLibrary-কে প্রতিস্থাপন করে এবং iCloud, অ্যালবাম, সম্পাদনা এবং Change Tracking সমর্থন করে। PhotoKit iCloud-এর মাধ্যমে স্বয়ংক্রিয় সিঙ্ক্রোনাইজেশন সহ কুয়েরি, ক্যাশিং এবং মিডিয়া লাইব্রেরি পরিবর্তনের জন্য একটি ইউনিফাইড API প্রদান করে।
মূল বিষয়
PhotoKit হল Apple-এর ফ্রেমওয়ার্ক (iOS 8, macOS 10.11-এ প্রবর্তিত) যা সিস্টেম মিডিয়া লাইব্রেরির সাথে কাজ করার জন্য অবজেক্ট-ওরিয়েন্টেড API প্রদান করে। AssetsLibrary-এর বিপরীতে, PhotoKit মিডিয়া লাইব্রেরিকে ডেটাবেস হিসেবে বিবেচনা করে: কুয়েরি PHAsset, PHCollection এবং PHCollectionList অবজেক্ট ফেরত দেয় যা বিষয়বস্তু এবং স্টোরেজ কাঠামো উপস্থাপন করে।
PhotoKit সব ধরনের মিডিয়া সমর্থন করে: ফটো (JPEG, HEIF, RAW), ভিডিও (MOV, MP4), Live Photos এবং বার্স্ট শট। ফ্রেমওয়ার্ক স্বয়ংক্রিয়ভাবে iCloud সিঙ্ক্রোনাইজেশন পরিচালনা করে: যদি একটি ছবি iCloud-এ সংরক্ষিত থাকে, PhotoKit তা নেটওয়ার্কের মাধ্যমে অনুরোধ করে এবং PHImageRequestOptions.progressHandler-এর মাধ্যমে অগ্রগতি জানায়।
PhotoKit-এর মূল বৈশিষ্ট্য হল PHObject-এর উপর ভিত্তি করে ডেটা মডেল যার একটি স্থানীয় আইডেন্টিফায়ার (localIdentifier) রয়েছে যা সেশনের মধ্যে স্থিতিশীল থাকে। এটি আপনাকে মিডিয়া অবজেক্টের রেফারেন্স সংরক্ষণ করতে এবং পুনরায় কুয়েরি না করে অ্যাপ পুনরারম্ভের পরে সেগুলি পুনরুদ্ধার করতে দেয়।
PhotoKit তিনটি স্তরে নির্মিত: ডেটা মডেল (PHObject), কুয়েরি (PHFetchResult) এবং পরিবর্তন (PHPhotoLibrary.performChanges)। ডেটা মডেলটি শ্রেণিবদ্ধ: PHAsset (ফটো/ভিডিও) PHAssetCollection (অ্যালবাম)-এর ভিতরে অবস্থিত, এবং অ্যালবামগুলি PHCollectionList (ফোল্ডার)-এ গোষ্ঠীভুক্ত হয়।
কুয়েরি PHAsset.fetchAssets এবং PHAssetCollection.fetchAssetCollections-এর মাধ্যমে সম্পাদিত হয়। সব fetch পদ্ধতি সিঙ্ক্রোনাস এবং PHFetchResult ফেরত দেয়, যা তাৎক্ষণিকভাবে মিডিয়া লাইব্রেরি ডেটাবেসের বিরুদ্ধে কুয়েরি সম্পাদন করে। PHFetchResult ইনডেক্স দ্বারা দ্রুত অ্যাক্সেস (object(at:)) এবং enumerateObjects-এর মাধ্যমে গণনা সমর্থন করে।
PHFetchOptions কুয়েরি কনফিগার করার জন্য অবজেক্ট: সাজানো (sortDescriptors), প্রেডিকেট (predicate), লুকানো এবং মুছে ফেলা মিডিয়া অন্তর্ভুক্ত করা (includeHiddenAssets, includeAllBurstAssets)। Fetch অপশন মিডিয়া ধরন অনুসারে ফিল্টার করার অনুমতি দেয়: PHAssetMediaType.image, .video, .audio.
PhotoKit-এ মিডিয়া লাইব্রেরি অ্যাক্সেস, কুয়েরি এবং পরিবর্তনের জন্য ক্লাসের একটি সেট অন্তর্ভুক্ত রয়েছে। ফ্রেমওয়ার্কের সাথে কার্যকরভাবে কাজ করার জন্য প্রতিটি বোঝা অপরিহার্য।
PHAsset একটি অপরিবর্তনীয় অবজেক্ট যা একটি মিডিয়া আইটেম উপস্থাপন করে। এতে মেটাডেটা রয়েছে: mediaType, mediaSubtypes, creationDate, location, pixelWidth, pixelHeight, duration (ভিডিওর জন্য), isFavorite, burstIdentifier। LocalIdentifier একটি স্থিতিশীল স্ট্রিং কী যা অ্যাপ পুনরারম্ভের পরেও অ্যাক্সেসযোগ্য।
PHAssetCollection মিডিয়ার একটি গ্রুপ: সিস্টেম অ্যালবাম (Recents, Favorites, Selfies, Screenshots), ব্যবহারকারী অ্যালবাম বা Moments (সময় এবং স্থান অনুসারে স্বয়ংক্রিয়ভাবে গোষ্ঠীভুক্ত)। বৈশিষ্ট্য: localizedTitle, assetCollectionType, assetCollectionSubtype, startDate, endDate.
PHCollectionList একটি ফোল্ডার যাতে অ্যালবাম (PHAssetCollection) বা অন্যান্য ফোল্ডার থাকে। এটি খুব কমই ব্যবহৃত হয়, মূলত ব্যবহারকারী ইন্টারফেসে শ্রেণিবিন্যাস প্রদর্শনের জন্য।
PhotoKit সরাসরি PHAsset থেকে UIImage ফেরত দেয় না — আপনাকে PHImageManager-এর মাধ্যমে ছবির অনুরোধ করতে হবে। এটি নিশ্চিত করে যে ছবিটি iCloud সমর্থন, ক্যাশিং এবং প্রয়োজনীয় আকারের সাথে লোড হয়েছে।
| উপাদান | উদ্দেশ্য | বৈশিষ্ট্য |
|---|---|---|
| PHImageManager.default() | একক অনুরোধের জন্য স্ট্যান্ডার্ড ম্যানেজার | অনুরোধের মধ্যে কোন ক্যাশিং নেই |
| PHCachingImageManager | সংগ্রহের জন্য প্রিলোডিং সহ ম্যানেজার | মসৃণ স্ক্রলিংয়ের জন্য startCachingImages |
| PHImageRequestOptions | অনুরোধ সেটিংস: আকার, মোড, ডেলিভারি | synchronous, deliveryMode, progressHandler |
| PHImageRequestID | বাতিলের জন্য অনুরোধ আইডেন্টিফায়ার | cancelImageRequest(PHImageRequestID) |
PHImageManager তিনটি ডেলিভারি মোড সমর্থন করে: opportunistic (প্রথমে ছোট সংস্করণ, তারপর পূর্ণ), highQualityFormat (শুধু পূর্ণ মানের) এবং fastFormat (দ্রুততম উপলব্ধ সংস্করণ)। সংগ্রহের জন্য, সর্বদা দৃশ্যমান কোষের জন্য ছবি প্রিলোডিং সহ PHCachingImageManager ব্যবহার করুন।
PhotoKit কাস্টম গ্যালারি, সম্পাদক এবং মিডিয়া অ্যাপ্লিকেশন তৈরির জন্য ব্যবহৃত হয়। আসুন তিনটি মূল পরিস্থিতি দেখি।
PHAsset.fetchAssets তৈরির তারিখ অনুসারে সাজানো PHFetchOptions সহ কাস্টম ফটো গ্যালারি তৈরির জন্য মৌলিক কুয়েরি। PHFetchResult লেজি লোডিং এবং স্ট্রিমিং অ্যাক্সেস সমর্থন করে।
let options = PHFetchOptions()
options.sortDescriptors = [NSSortDescriptor(
key: "creationDate",
ascending: .false
)]
options.predicate = NSPredicate(
format: "mediaType == %d",
PHAssetMediaType.image.rawValue
)
let allPhotos = PHAsset.fetchAssets(with: options)
print("\(allPhotos.count) টি ফটো পাওয়া গেছে")
allPhotos.enumerateObjects { asset, index, stop in
print("ফটো \(index): \(asset.localIdentifier)")
}
PHFetchResult একটি থ্রেড-সেফ কন্টেইনার। object(at:) এর মাধ্যমে ইনডেক্স দ্বারা অবজেক্ট অ্যাক্সেস করা UI ব্লক করে না, কিন্তু PHImageManager-এর মাধ্যমে ছবির অনুরোধ অ্যাসিঙ্ক্রোনাসভাবে করা উচিত।
PHCachingImageManager প্রিলোডিংয়ের জন্য startCachingImages এবং stopCachingImages পদ্ধতি সহ PHImageManager-এর একটি সাবক্লাস। এটি মসৃণ স্ক্রলিংয়ের জন্য UICollectionView-এ ব্যবহৃত হয়।
let cachingManager = PHCachingImageManager()
let targetSize = CGSize(width: 200, height: 200)
// দৃশ্যমান কোষের জন্য প্রিলোড
cachingManager.startCachingImages(
for: visibleAssets,
targetSize: targetSize,
contentMode: .aspectFill,
options: nil
)
// PHImageRequestOptions-এর মাধ্যমে iCloud ফলব্যাক সহ ছবির অনুরোধ
let requestOptions = PHImageRequestOptions()
requestOptions.deliveryMode = .opportunistic
requestOptions.isNetworkAccessAllowed = .true
requestOptions.progressHandler = { progress, error, stop, info in
DispatchQueue.main.async {
print("iCloud থেকে ডাউনলোড হচ্ছে: \(progress * 100)%")
}
}
let requestID = cachingManager.requestImage(
for: asset,
targetSize: targetSize,
contentMode: .aspectFill,
options: requestOptions
) { image, info in
print("ছবি পাওয়া গেছে: \(image?.size ?? .zero)")
}
মিডিয়া লাইব্রেরিতে পরিবর্তন PHPhotoLibrary.shared().performChanges-এর মাধ্যমে changeRequest ব্লকের ভিতরে সম্পাদিত হয়। সব অপারেশন ব্যাচ করা হয় এবং লেনদেন হিসেবে প্রয়োগ করা হয়।
PHPhotoLibrary.shared().performChanges {
let changeRequest = PHAssetChangeRequest(for: asset)
changeRequest.isFavorite = .true
} completionHandler: { success, error in
if success {
print("পছন্দে যোগ করা হয়েছে")
}
}
PhotoKit PHPhotoLibraryChangeObserver প্রোটোকলের মাধ্যমে মিডিয়া লাইব্রেরি পরিবর্তন পর্যবেক্ষণের জন্য একটি পদ্ধতি প্রদান করে। যখন কোন পরিবর্তন ঘটে (সৃষ্টি, মুছে ফেলা, সম্পাদনা), তখন PHChange অবজেক্ট সহ photoLibraryDidChange পদ্ধতি কল করা হয়।
PHChange-এ প্রতিটি কুয়েরি ধরনের জন্য changeDetails থাকে: PHFetchResultChangeDetails যাতে removedIndexes, insertedIndexes, changedIndexes থাকে। এটি UICollectionView-এর জন্য performBatchUpdates-এর মাধ্যমে অ্যানিমেশন সহ UI-তে পরিবর্তন প্রয়োগ করার অনুমতি দেয়।
class PhotosViewController: UIViewController {
var fetchResult: PHFetchResult>PHAsset>?
override func viewDidLoad() {
super.viewDidLoad()
PHPhotoLibrary.shared().register(self)
}
deinit {
PHPhotoLibrary.shared().unregisterChangeObserver(self)
}
}
extension PhotosViewController: PHPhotoLibraryChangeObserver {
func photoLibraryDidChange(_ changeInstance: PHChange) {
guard let fetchResult,
let details = changeInstance.changeDetails(for: fetchResult)
else { return }
DispatchQueue.main.async {
self.fetchResult = details.fetchResultAfterChanges
// collectionView-এ পরিবর্তন প্রয়োগ করুন
}
}
}
PhotoKit PHContentEditingInput এবং PHContentEditingOutput পদ্ধতির মাধ্যমে মিডিয়া সম্পাদনা সমর্থন করে। অ্যাপ মূল ডেটা সহ editingInput অনুরোধ করে, পরিবর্তন প্রয়োগ করে এবং editingOutput-এর মাধ্যমে ফলাফল সংরক্ষণ করে। ফ্রেমওয়ার্ক স্বয়ংক্রিয়ভাবে মূল সংরক্ষণ করে, ব্যবহারকারীদের মূল পুনরুদ্ধার করে পরিবর্তন ফিরিয়ে নেওয়ার অনুমতি দেয়।
RAW ফটো (DNG, CR2, NEF) PHAssetResourceManager-এর মাধ্যমে সমর্থিত, যা মূল RAW ফাইলটিতে অ্যাক্সেস প্রদান করে। RAW প্রক্রিয়াকরণের জন্য, CIRAWFilter-এর সাথে CoreImage ব্যবহার করার পরামর্শ দেওয়া হয়, যা তাপমাত্রা, এক্সপোজার এবং তীক্ষ্ণতা সামঞ্জস্য সমর্থন করে। PhotoKit Photo Editing Extension (iOS)-এর মাধ্যমে সম্পাদক এক্সটেনশনও সমর্থন করে — একটি নির্বাচিত ফটো বা ভিডিও প্রক্রিয়া করার জন্য সিস্টেম সম্পাদক থেকে একটি অ্যাপ কল করা যেতে পারে।
PhotoKit একটি শক্তিশালী কিন্তু সম্পদ-নিবিড় ফ্রেমওয়ার্ক। ভুল ব্যবহার স্ক্রল ল্যাগ এবং অতিরিক্ত মেমরি খরচের কারণ হতে পারে। সর্বোত্তম কর্মক্ষমতার জন্য এই সুপারিশগুলি অনুসরণ করুন।
PHLivePhoto-এর জন্য PHLivePhoto.request(with:targetSize:contentMode:options:resultHandler:)-এর মাধ্যমে আলাদা অনুরোধ প্রয়োজন। যে কোষগুলি শুধু ফটো প্রদর্শন করে তাদের জন্য Live Photo অনুরোধ করবেন না — নির্দেশকের জন্য PHLivePhotoBadge ব্যবহার করুন।
সচরাচর জিজ্ঞাসা
PhotoKit মিডিয়া লাইব্রেরির সাথে কাজ করার জন্য Apple-এর আধুনিক ফ্রেমওয়ার্ক, যা iOS 8-এ প্রবর্তিত। পুরনো AssetsLibrary-এর বিপরীতে, PhotoKit PHAsset অবজেক্ট মডেল, দ্রুত অনুসন্ধান সহ PHFetchResult, iCloud সমর্থন এবং পরিবর্তন পর্যবেক্ষণের জন্য Change Tracking প্রদান করে।
কলব্যাক হ্যান্ডলার সহ PHPhotoLibrary.requestAuthorization(for: .readWrite) কল করুন। .authorized স্ট্যাটাস পাওয়ার পর, আপনি PHAsset.fetchAssets কুয়েরি সম্পাদন করতে পারেন। লেখার অ্যাক্সেসের জন্য .readWrite অনুমতি প্রয়োজন। শুধু পড়ার জন্য — .addOnly.
প্যারামিটার সহ PHImageManager.default().requestImage ব্যবহার করুন: asset, targetSize, contentMode এবং PHImageRequestOptions। অ্যাসিঙ্ক্রোনাস পদ্ধতি PHImageRequestID ফেরত দেয়, যা অনুরোধ বাতিল করার অনুমতি দেয়। সংগ্রহের জন্য, প্রিলোডিং সহ PHCachingImageManager ব্যবহার করুন।
PHPhotoLibrary.shared().register(self)-এর মাধ্যমে একটি পর্যবেক্ষক নিবন্ধন করুন এবং PHPhotoLibraryChangeObserver প্রোটোকল বাস্তবায়ন করুন। photoLibraryDidChange পদ্ধতিতে, প্রতিটি fetchResult-এর জন্য changeDetails সহ PHChange গ্রহণ করুন এবং অ্যানিমেশন সহ UI-তে পরিবর্তন প্রয়োগ করুন।
PHImageRequestOptions-এ, iCloud ডাউনলোড অগ্রগতি ট্র্যাক করার জন্য isNetworkAccessAllowed = true এবং progressHandler সেট করুন। দ্রুত স্ক্রলিংয়ের সময়, নেটওয়ার্ক অ্যাক্সেস অক্ষম করুন এবং স্ক্রল বিলম্ব এড়াতে শুধু স্থানীয় সংস্করণ লোড করুন।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন