Save image to photo library using photo framework

前端 未结 4 590
眼角桃花
眼角桃花 2020-12-16 00:51

My app crashes every time when I try to save image using photo framework.

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMedi         


        
相关标签:
4条回答
  • 2020-12-16 00:58

    Here is an example of code how you can write/save image to Photo Library using UIImageWriteToSavedPhotosAlbum function:

    - (void)saveImage:(UIImage *)image {
        UIImageWriteToSavedPhotosAlbum(self.image, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL);
    }
    - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo;
    {
        if (!error) {
            // saved successfully
    
            PHFetchOptions *fetchOptions = [PHFetchOptions new];
            fetchOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO]];
            PHAsset *asset = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:fetchOptions].firstObject;
            if (asset != nil) {
                // here you can use asset of your image
            }
        } else {
            NSLog(@"save image error: %@", error);
        }
    }
    

    Don't forget to add into your Info.plist a key-value pair Privacy - Camera Usage Description with description of usage.

    0 讨论(0)
  • 2020-12-16 01:00

    All you need to do is trigger a creation request. As the error says, you can access the change request only inside the performChanges block.

    So to save the image you would do something like this:

    [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
        [PHAssetChangeRequest creationRequestForAssetFromImage:[info valueForKey:UIImagePickerControllerOriginalImage]];
    } completionHandler:^(BOOL success, NSError *error) {
        if (success) {
             NSLog(@"Success");
        }
        else {
            NSLog(@"write error : %@",error);
        }
    }];
    

    In case you need to do something with the placeholder of the newly created asset, you can access it inside the same performChanges block:

    PHAssetChangeRequest *changeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:[info valueForKey:UIImagePickerControllerOriginalImage]];
    PHObjectPlaceholder *assetPlaceholder = changeRequest.placeholderForCreatedAsset;
    
    0 讨论(0)
  • 2020-12-16 01:06

    In Swift 3 I do this to save the video to the library.

            if mediaType.isEqual(to: (kUTTypeMovie as NSString) as String) {
                if let videoURL = info[UIImagePickerControllerMediaURL] as? URL {
    
                PHPhotoLibrary.shared().performChanges({
                    _ = PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: videoURL)
                }, completionHandler: { (success, error) in
                    if success {
                        print("ok")
                        let videoData = NSData(contentsOf: videoURL)
                        // use videoData here if needed...
                        if let posterImage = self.firstFrame(videoURL: videoURL) {
                            self.imageView.image = posterImage
                        }
                        picker.dismiss(animated: true) { () -> Void in
    
                        }
                    }
                    else {
                        print(error?.localizedDescription)
                    }
                })
            }
        }
    
    0 讨论(0)
  • 2020-12-16 01:24
    1. delete third line of the code
    2. Verify that the _mChangeRequest is __block variable
    3. compile and run

    you will see that image in the photos app

    you will change code probably like this...

    -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
    
      __block PHAssetChangeRequest *_mChangeRequest = nil;
    
      [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
    
      _mChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:[info valueForKey:UIImagePickerControllerOriginalImage]];
    
      } completionHandler:^(BOOL success, NSError *error) {
    
          if (success) {
    
              PHObjectPlaceholder *assetPlaceholder = _mChangeRequest.placeholderForCreatedAsset;
          }
          else {
    
             NSLog(@"write error : %@",error);
          }
    }];
    }
    
    0 讨论(0)
提交回复
热议问题