如何将图片保存到iPhone照片库?
我需要做些什么来保存我的程序生成的图像(可能从相机,可能不是)到iPhone上的系统照片库?
你可以使用这个function:
UIImageWriteToSavedPhotosAlbum(UIImage *image, id completionTarget, SEL completionSelector, void *contextInfo);
你只需要completionTarget , completionSelector和contextInfo如果你想在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>)
如果您不希望在保存图像时收到通知,则可以在completionTarget , completionSelector和contextInfo参数中传递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); });