আইফোনের ফটো লাইব্রেরিতে কীভাবে ছবি সংরক্ষণ করবেন?


193

আইফোনটির সিস্টেম ফটো লাইব্রেরিতে আমার প্রোগ্রামটি তৈরি করা চিত্র (সম্ভবত ক্যামেরা থেকে সম্ভবত সম্ভবত নয়) সংরক্ষণ করার জন্য আমাকে কী করতে হবে?


আপনি এই কোডটি চেক করতে পারেন । মহান দিন!
সেলিল বোজকুর্ট

উত্তর:


411

আপনি এই ফাংশনটি ব্যবহার করতে পারেন:

UIImageWriteToSavedPhotosAlbum(UIImage *image, 
                               id completionTarget, 
                               SEL completionSelector, 
                               void *contextInfo);

আপনার কেবলমাত্র সমাপ্তি ট্রেজেট , সমাপ্তি নির্বাচক এবং প্রসঙ্গের দরকার যদি সংরক্ষণটি সম্পন্ন করা হয় তবে আপনি যদি অবহিত হতে চান তবে UIImageঅন্যথায় আপনি পাস করতে পারেন nil

এর জন্য অফিসিয়াল ডকুমেন্টেশনUIImageWriteToSavedPhotosAlbum() দেখুন ।


সঠিক উত্তরের জন্য +1 নিন
নিরু মুকুন্দ শাহ

হাই আপনার দুর্দান্ত সমাধানের জন্য ধন্যবাদ। এখানে আমার একটি সন্দেহ রয়েছে যে ফটো লাইব্রেরিতে চিত্র সংরক্ষণের সময় আমরা কীভাবে নকলগুলি এড়াতে পারি। আগাম ধন্যবাদ.
নরেশ

: আপনি ভালো মানের সংরক্ষণ করতে চান তাহলে, এই দেখুন stackoverflow.com/questions/1379274/...
eonil

4
ব্যবহারকারীদের অ্যালবাম ফটোগুলি সংরক্ষণ করতে আপনাকে এখন আইওএস 11 হিসাবে 'গোপনীয়তা - ফটো লাইব্রেরি সংযোজনগুলির ব্যবহারের বিবরণ' যুক্ত করতে হবে।
ঘোড়াজকি

1
কীভাবে সংরক্ষিত চিত্রগুলিকে একটি নাম দেওয়া যায়?
প্রিয়াল

63

আইওএস 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];

1
ছবির পাশাপাশি সালিশী মেটাডেটা সংরক্ষণ করার কোনও উপায় আছে?
জাকদানস

2
আমি ব্যবহার করে সংরক্ষণের চেষ্টা করেছি ALAssetsLibrary, এটি সংরক্ষণ করতে ঠিক একই সময় লাগে UIImageWriteToSavedPhotosAlbum
হ্লুং

এবং এটি ক্যামেরা
হিমশীতল করে

এটি হ'ল এত পরিচ্ছন্ন বি / সি আপনি সম্পূর্ণরূপে পরিচালনা করতে একটি ব্লক ব্যবহার করতে পারেন।
jpswain

5
আমি এই কোডটি ব্যবহার করছি এবং আমি এই ফ্রেমওয়ার্কটি # ইমপোর্ট <অ্যাসেটস লাইব্রেরি / অ্যাসেটস লাইবারি। উত্তরটি সম্পাদনা করা উচিত নয়? @ ডেনিস
জুলিয়ান ওসোরিও

30

সবচেয়ে সহজ উপায়:

UIImageWriteToSavedPhotosAlbum(myUIImage, nil, nil, nil);

এর জন্য Swift, আপনি সুইফ্ট ব্যবহার করে আইওএস ফটো লাইব্রেরিতে সেভিং পড়তে পারেন


3
আমি সত্যিই আপনার এসও ব্যবহারকারীর প্রোফাইল আইকনটি পছন্দ করি। বেশ শীতল এক্সকোড চিত্র।
সুপারটেকনোবফ

1
চমত্কারভাবে সহজ, এবং খুব খুব সহজ!
অপরাহ্ন

13

একটি জিনিস মনে রাখবেন: আপনি যদি কলব্যাক ব্যবহার করেন তবে নিশ্চিত হয়ে নিন যে আপনার নির্বাচক নিম্নলিখিত ফর্মের সাথে সম্মত হয়েছেন:

- (void) image: (UIImage *) image didFinishSavingWithError: (NSError *) error contextInfo: (void *) contextInfo;

অন্যথায়, আপনি নিম্নলিখিত হিসাবে একটি ত্রুটি সঙ্গে ক্র্যাশ হবে:

[NSInvocation setArgument:atIndex:]: index (2) out of bounds [-1, 1]


10

একটি অ্যারে থেকে এটির মতো কেবল চিত্রগুলি পাস করুন

-(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);
        }
}

টাইপোর ধরণের জন্য দুঃখিত, এটি কেবল উড়ে এসেছিল তবে আপনি পয়েন্টটি পান


এটি ব্যবহার করে কিছু ফটো মিস হবে, আমি চেষ্টা করেছি। এটির সঠিক উপায় হ'ল সমাপ্তি নির্বাচক থেকে কল ব্যাক ব্যবহার করা।
সামচেন

1
আমরা কি কাস্টম নামের সাথে চিত্রগুলি সংরক্ষণ করতে পারি?
ব্যবহারকারী 1531343

এর জন্য কখনই লুপ ব্যবহার করা উচিত নয়। এটি রেসের অবস্থার দিকে নিয়ে যায় এবং ক্রাশ হয়।
সৌরভ

4

কোনও অ্যারের ফটোগুলি সংরক্ষণ করার সময় লুপের জন্য ব্যবহার করবেন না, নিম্নলিখিতটি করুন

-(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);
   }
}

4

ইন সুইফট :

    // 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.
            }
    }

হ্যাঁ ... দুর্দান্ত..কিন্তু চিত্র সংরক্ষণের পরে আমি চিত্রটি গ্যালারী থেকে লোড করতে চাই ... কীভাবে এটি করা যায়
EI ক্যাপ্টেন v2.0

4

নীচে ফাংশন কাজ করবে। আপনি এখান থেকে অনুলিপি এবং সেখানে পেস্ট করতে পারেন ...

-(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");
        }
    }];
}

2

সুইফট 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!")
    }
}

1

আমার শেষ উত্তর এটি করবে ..

প্রতিটি চিত্রের জন্য আপনি সংরক্ষণ করতে চান, এটি একটি এনএসমিটেবলআরে যুক্ত করুন

    //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);
        }
}

আমি আপনার সমাধান চেষ্টা করেছি, এটি সবসময় কিছু ফটো মিস করে। আমার উত্তর দেখুন। লিংক
সামচেন

1
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];
}

এই উত্তরটি সঠিক নয় কারণ এটি চিত্র ফটো লাইব্রেরিতে চিত্রটি সংরক্ষণ করে না, তবে স্যান্ডবক্সে।
ইভান

1

উপরের কয়েকটি উত্তরের ভিত্তিতে আমি এর জন্য একটি ইউআইআইমেজভিউ বিভাগ তৈরি করেছি 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চ্ছিকভাবে আপনি সর্বনিম্ন প্রেসডোরেশন প্যারামিটারটি পরিবর্তন করতে পারেন।


1

ইন সুইফট 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 টি পরামিতি থাকা উচিত অন্যথায় আপনি এনএসআইভোকেশন ত্রুটিতে চলে যাবেন।

আশা করি এটা সাহায্য করবে.


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.