উত্তর:
আপনি এই ফাংশনটি ব্যবহার করতে পারেন:
UIImageWriteToSavedPhotosAlbum(UIImage *image,
id completionTarget,
SEL completionSelector,
void *contextInfo);
আপনার কেবলমাত্র সমাপ্তি ট্রেজেট , সমাপ্তি নির্বাচক এবং প্রসঙ্গের দরকার যদি সংরক্ষণটি সম্পন্ন করা হয় তবে আপনি যদি অবহিত হতে চান তবে UIImage
অন্যথায় আপনি পাস করতে পারেন nil
।
এর জন্য অফিসিয়াল ডকুমেন্টেশনUIImageWriteToSavedPhotosAlbum()
দেখুন ।
আইওএস 9.0 এ অবমূল্যায়িত।
এর পরে আরও দ্রুত ইউআইআইমেজ রাইট্রোটটোসেভডফোটস অ্যালবাম আইওএস ব্যবহার করে এটি করার উপায় 4.0+ অ্যাসেটস লাইব্রেরি ফ্রেমওয়ার্ক
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library writeImageToSavedPhotosAlbum:[image CGImage] orientation:(ALAssetOrientation)[image imageOrientation] completionBlock:^(NSURL *assetURL, NSError *error){
if (error) {
// TODO: error handling
} else {
// TODO: success handling
}
}];
[library release];
ALAssetsLibrary
, এটি সংরক্ষণ করতে ঠিক একই সময় লাগে UIImageWriteToSavedPhotosAlbum
।
সবচেয়ে সহজ উপায়:
UIImageWriteToSavedPhotosAlbum(myUIImage, nil, nil, nil);
এর জন্য Swift
, আপনি সুইফ্ট ব্যবহার করে আইওএস ফটো লাইব্রেরিতে সেভিং পড়তে পারেন
একটি জিনিস মনে রাখবেন: আপনি যদি কলব্যাক ব্যবহার করেন তবে নিশ্চিত হয়ে নিন যে আপনার নির্বাচক নিম্নলিখিত ফর্মের সাথে সম্মত হয়েছেন:
- (void) image: (UIImage *) image didFinishSavingWithError: (NSError *) error contextInfo: (void *) contextInfo;
অন্যথায়, আপনি নিম্নলিখিত হিসাবে একটি ত্রুটি সঙ্গে ক্র্যাশ হবে:
[NSInvocation setArgument:atIndex:]: index (2) out of bounds [-1, 1]
একটি অ্যারে থেকে এটির মতো কেবল চিত্রগুলি পাস করুন
-(void) saveMePlease {
//Loop through the array here
for (int i=0:i<[arrayOfPhotos count]:i++){
NSString *file = [arrayOfPhotos objectAtIndex:i];
NSString *path = [get the path of the image like you would in DOCS FOLDER or whatever];
NSString *imagePath = [path stringByAppendingString:file];
UIImage *image = [[[UIImage alloc] initWithContentsOfFile:imagePath]autorelease];
//Now it will do this for each photo in the array
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
}
}
টাইপোর ধরণের জন্য দুঃখিত, এটি কেবল উড়ে এসেছিল তবে আপনি পয়েন্টটি পান
কোনও অ্যারের ফটোগুলি সংরক্ষণ করার সময় লুপের জন্য ব্যবহার করবেন না, নিম্নলিখিতটি করুন
-(void)saveToAlbum{
[self performSelectorInBackground:@selector(startSavingToAlbum) withObject:nil];
}
-(void)startSavingToAlbum{
currentSavingIndex = 0;
UIImage* img = arrayOfPhoto[currentSavingIndex];//get your image
UIImageWriteToSavedPhotosAlbum(img, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
}
- (void)image: (UIImage *) image didFinishSavingWithError: (NSError *) error contextInfo: (void *) contextInfo{ //can also handle error message as well
currentSavingIndex ++;
if (currentSavingIndex >= arrayOfPhoto.count) {
return; //notify the user it's done.
}
else
{
UIImage* img = arrayOfPhoto[currentSavingIndex];
UIImageWriteToSavedPhotosAlbum(img, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
}
}
ইন সুইফট :
// Save it to the camera roll / saved photo album
// UIImageWriteToSavedPhotosAlbum(self.myUIImageView.image, nil, nil, nil) or
UIImageWriteToSavedPhotosAlbum(self.myUIImageView.image, self, "image:didFinishSavingWithError:contextInfo:", nil)
func image(image: UIImage!, didFinishSavingWithError error: NSError!, contextInfo: AnyObject!) {
if (error != nil) {
// Something wrong happened.
} else {
// Everything is alright.
}
}
নীচে ফাংশন কাজ করবে। আপনি এখান থেকে অনুলিপি এবং সেখানে পেস্ট করতে পারেন ...
-(void)savePhotoToAlbum:(UIImage*)imageToSave {
CGImageRef imageRef = imageToSave.CGImage;
NSDictionary *metadata = [NSDictionary new]; // you can add
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library writeImageToSavedPhotosAlbum:imageRef metadata:metadata completionBlock:^(NSURL *assetURL,NSError *error){
if(error) {
NSLog(@"Image save eror");
}
}];
}
সুইফট 4
func writeImage(image: UIImage) {
UIImageWriteToSavedPhotosAlbum(image, self, #selector(self.finishWriteImage), nil)
}
@objc private func finishWriteImage(_ image: UIImage, didFinishSavingWithError error: NSError?, contextInfo: UnsafeRawPointer) {
if (error != nil) {
// Something wrong happened.
print("error occurred: \(String(describing: error))")
} else {
// Everything is alright.
print("saved success!")
}
}
আমার শেষ উত্তর এটি করবে ..
প্রতিটি চিত্রের জন্য আপনি সংরক্ষণ করতে চান, এটি একটি এনএসমিটেবলআরে যুক্ত করুন
//in the .h file put:
NSMutableArray *myPhotoArray;
///then in the .m
- (void) viewDidLoad {
myPhotoArray = [[NSMutableArray alloc]init];
}
//However Your getting images
- (void) someOtherMethod {
UIImage *someImage = [your prefered method of using this];
[myPhotoArray addObject:someImage];
}
-(void) saveMePlease {
//Loop through the array here
for (int i=0:i<[myPhotoArray count]:i++){
NSString *file = [myPhotoArray objectAtIndex:i];
NSString *path = [get the path of the image like you would in DOCS FOLDER or whatever];
NSString *imagePath = [path stringByAppendingString:file];
UIImage *image = [[[UIImage alloc] initWithContentsOfFile:imagePath]autorelease];
//Now it will do this for each photo in the array
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
}
}
homeDirectoryPath = NSHomeDirectory();
unexpandedPath = [homeDirectoryPath stringByAppendingString:@"/Pictures/"];
folderPath = [NSString pathWithComponents:[NSArray arrayWithObjects:[NSString stringWithString:[unexpandedPath stringByExpandingTildeInPath]], nil]];
unexpandedImagePath = [folderPath stringByAppendingString:@"/image.png"];
imagePath = [NSString pathWithComponents:[NSArray arrayWithObjects:[NSString stringWithString:[unexpandedImagePath stringByExpandingTildeInPath]], nil]];
if (![[NSFileManager defaultManager] fileExistsAtPath:folderPath isDirectory:NULL]) {
[[NSFileManager defaultManager] createDirectoryAtPath:folderPath attributes:nil];
}
উপরের কয়েকটি উত্তরের ভিত্তিতে আমি এর জন্য একটি ইউআইআইমেজভিউ বিভাগ তৈরি করেছি created
শিরোনাম ফাইল:
@interface UIImageView (SaveImage) <UIActionSheetDelegate>
- (void)addHoldToSave;
@end
বাস্তবায়ন
@implementation UIImageView (SaveImage)
- (void)addHoldToSave{
UILongPressGestureRecognizer* longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
longPress.minimumPressDuration = 1.0f;
[self addGestureRecognizer:longPress];
}
- (void)handleLongPress:(UILongPressGestureRecognizer*)sender {
if (sender.state == UIGestureRecognizerStateEnded) {
UIActionSheet* _attachmentMenuSheet = [[UIActionSheet alloc] initWithTitle:nil
delegate:self
cancelButtonTitle:@"Cancel"
destructiveButtonTitle:nil
otherButtonTitles:@"Save Image", nil];
[_attachmentMenuSheet showInView:[[UIView alloc] initWithFrame:self.frame]];
}
else if (sender.state == UIGestureRecognizerStateBegan){
//Do nothing
}
}
-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{
if (buttonIndex == 0) {
UIImageWriteToSavedPhotosAlbum(self.image, nil,nil, nil);
}
}
@end
এখন কেবল আপনার চিত্র দর্শনে এই ফাংশনটি কল করুন:
[self.imageView addHoldToSave];
Ptionচ্ছিকভাবে আপনি সর্বনিম্ন প্রেসডোরেশন প্যারামিটারটি পরিবর্তন করতে পারেন।
ইন সুইফট 2.2
UIImageWriteToSavedPhotosAlbum(image: UIImage, _ completionTarget: AnyObject?, _ completionSelector: Selector, _ contextInfo: UnsafeMutablePointer<Void>)
যখন আপনি ইমেজ তারপর সংরক্ষণ সম্পন্ন করা হয় ঘোষিত হতে না চান তাহলে আপনি শূন্য পাস হতে পারে completionTarget , completionSelector এবং contextInfo প্যারামিটার।
উদাহরণ:
UIImageWriteToSavedPhotosAlbum(image, self, #selector(self.imageSaved(_:didFinishSavingWithError:contextInfo:)), nil)
func imageSaved(image: UIImage!, didFinishSavingWithError error: NSError?, contextInfo: AnyObject?) {
if (error != nil) {
// Something wrong happened.
} else {
// Everything is alright.
}
}
এখানে লক্ষণীয় গুরুত্বপূর্ণ বিষয়টি হ'ল আপনার পদ্ধতিতে যা চিত্র সংরক্ষণটি পর্যবেক্ষণ করে তাদের এই 3 টি পরামিতি থাকা উচিত অন্যথায় আপনি এনএসআইভোকেশন ত্রুটিতে চলে যাবেন।
আশা করি এটা সাহায্য করবে.
আপনি এটি ব্যবহার করতে পারেন
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
UIImageWriteToSavedPhotosAlbum(img.image, nil, nil, nil);
});