如何将图片保存到iPhone照片库?

我需要做些什么来保存我的程序生成的图像(可能从相机,可能不是)到iPhone上的系统照片库?

你可以使用这个function:

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

你只需要completionTargetcompletionSelectorcontextInfo如果你想在UIImage完成保存时得到通知,否则你可以传入nil

请参阅UIImageWriteToSavedPhotosAlbum()的官方文档 。

在iOS 9.0中弃用。

有更快的UIImageWriteToSavedPhotosAlbum方式来使用iOS 4.0+ AssetsLibrary框架

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

最简单的方法是:

 UIImageWriteToSavedPhotosAlbum(myUIImage, nil, nil, nil); 

有一件事要记住:如果您使用callback,请确保您的select符合以下forms:

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

对不起,错字的刚刚做了这个dynamic,但你明白了

保存一系列照片时,请勿使用for循环,请执行以下操作

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

Swift中

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

以下function将工作。 你可以从这里复制并粘贴在那里…

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

我最后的答案会做到这一点..

对于要保存的每个图像,将其添加到NSMutableArray

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

基于上面的一些答案,我为此创build了一个UIImageView类别。

头文件:

 @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 

现在只需在你的imageview上调用这个函数:

 [self.imageView addHoldToSave]; 

您也可以select更改minimumPressDuration参数。

Swift 2.2中

 UIImageWriteToSavedPhotosAlbum(image: UIImage, _ completionTarget: AnyObject?, _ completionSelector: Selector, _ contextInfo: UnsafeMutablePointer<Void>) 

如果您不希望在保存图像时收到通知,则可以在completionTargetcompletionSelectorcontextInfo参数中传递nil。

例:

 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个参数,否则你会遇到NSInvocation错误。

希望它有帮助。

你可以使用这个

 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ UIImageWriteToSavedPhotosAlbum(img.image, nil, nil, nil); });