【问题标题】:iPhone: How do I get the file path of an image saved with UIImageWriteToSavedPhotosAlbum()?iPhone:如何获取使用 UIImageWriteToSavedPhotosAlbum() 保存的图像的文件路径?
【发布时间】:2011-05-26 08:48:38
【问题描述】:

我正在使用以下方法将合并的图像保存到 iPhone 照片库:

UIImageWriteToSavedPhotosAlbum(viewImage, self, @selector(savedPhotoImage:didFinishSavingWithError:contextInfo:), nil);

并使用以下方法获取回调:

- (void) savedPhotoImage:(UIImage*)image didFinishSavingWithError:(NSError *)error contextInfo: (void *)contextInfo { NSLog(@"%@", [error localizedDescription]);
NSLog(@"info: %@", contextInfo);}

我想得到的是图像的保存路径,所以我可以将它添加到一个数组中,该数组将用于在应用程序的其他位置调用已保存项目的列表。

当我使用选择器加载图像时,它会显示路径信息。 但是,当我保存创建的图像时,我找不到将保存的图像路径拉到哪里。

我已经搜索过网络,但大多数示例都在回调中停止,并带有一条很好的消息,说明图像已成功保存。 我只想知道它保存在哪里。

我知道一种方法可能是开始定义我自己的路径,但是当该方法为我这样做时,我只是希望它可以告诉我它保存到哪里。

【问题讨论】:

    标签: iphone ios uiimage save photolibrary


    【解决方案1】:

    斯威夫特版本

                var localId = ""
                PHPhotoLibrary.shared().performChanges({
                    let assetChangeRequest:PHAssetChangeRequest = PHAssetChangeRequest.creationRequestForAsset(from: chosenImage)
                    localId = assetChangeRequest.placeholderForCreatedAsset!.localIdentifier
                }) { (success, error) in
                    let assetResult:PHFetchResult = PHAsset.fetchAssets(withLocalIdentifiers: [localId], options: nil)
                    let asset:PHAsset = assetResult.firstObject!
                    PHImageManager.default().requestImageData(for: asset, options: nil) { (imageData, dataUTI, orientation, info) in
                        if let url:URL = info?["PHImageFileURLKey"] as? URL
                        {
                            print("\(url)")
                            
                        }
                        
                    }
                    
                }
    

    【讨论】:

      【解决方案2】:

      OlivariesF 的回答缺少这个问题的关键部分,检索路径:

      这是一个可以做所有事情的代码 sn-p:

      - (void)processImage:(UIImage*)image type:(NSString*)mimeType forCallbackId:(NSString*)callbackId
          {
              __block NSString* localId;
      
              // Add it to the photo library
              [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
                  PHAssetChangeRequest *assetChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image];
      
                  localId = [[assetChangeRequest placeholderForCreatedAsset] localIdentifier];
              } completionHandler:^(BOOL success, NSError *err) {
                  if (!success) {
                      NSLog(@"Error saving image: %@", [err localizedDescription]);
                  } else {
                      PHFetchResult* assetResult = [PHAsset fetchAssetsWithLocalIdentifiers:@[localId] options:nil];
                      PHAsset *asset = [assetResult firstObject];
                      [[PHImageManager defaultManager] requestImageDataForAsset:asset
                                                                        options:nil
                                                                  resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) {
                          NSURL *fileUrl = [info objectForKey:@"PHImageFileURLKey"];
                          if (fileUrl) {
                              NSLog(@"Image path: %@", [fileUrl relativePath]);
                          } else {
                              NSLog(@"Error retrieving image filePath, heres whats available: %@", info);
                          }
                      }];
                  }
              }];
          }
      

      【讨论】:

      • 在 PHAsset 信息中找不到密钥 PHImageFileURLKey
      【解决方案3】:

      OlivaresF 的回答 Swift 4.1 版本

              PHPhotoLibrary.shared().performChanges({
                      PHAssetChangeRequest.creationRequestForAsset(from: image)
                  }) { (success, error) in
                      if success {
      
                      } else {
                      }
                  }
      

      【讨论】:

      • 我没有看到您在代码中的确切位置按照 OP 的要求打印/返回了文件路径?
      【解决方案4】:

      ALAssetsLibrary 已被弃用。

      你应该这样做:

      #import <Photos/Photos.h>
      
      UIImage *yourImage;
      
      [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
          [PHAssetChangeRequest creationRequestForAssetFromImage:yourImage];
      } completionHandler:^(BOOL success, NSError *error) {
          if (success) {
              NSLog(@"Success");
          } else {
              NSLog(@"write error : %@",error);
          }
      }];
      

      【讨论】:

        【解决方案5】:

        Swift 版本将是

         ALAssetsLibrary().writeImageToSavedPhotosAlbum(editedImage.CGImage, orientation: ALAssetOrientation(rawValue: editedImage.imageOrientation.rawValue)!,
                        completionBlock:{ (path:NSURL!, error:NSError!) -> Void in
                            print("\(path)")
                    })
        

        并在您的文件中“导入 ALAssetsLibrary”。

        项目-> 构建阶段-> 链接二进制文件-> AssetsLibrary.framework

        【讨论】:

          【解决方案6】:

          我的代码是

          -(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
              UIImage *image = [info valueForKey:UIImagePickerControllerOriginalImage];
          
              imageURL = nil;
          
              ALAssetsLibraryWriteImageCompletionBlock completeBlock = ^(NSURL *assetURL, NSError *error){
                  if (!error) {  
                      #pragma mark get image url from camera capture.
                      imageURL = [NSString stringWithFormat:@"%@",assetURL];
          
                  }  
              };
          
              if(image){
                  ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
                  [library writeImageToSavedPhotosAlbum:[image CGImage] 
                                            orientation:(ALAssetOrientation)[image imageOrientation] 
                                        completionBlock:completeBlock];
              }
          }
          

          在.h中导入库并定义ALAssetsLibraryWriteImageCompletionBlock的类型def

          #import <UIKit/UIKit.h>
          #import <AssetsLibrary/AssetsLibrary.h>
          
          typedef void (^ALAssetsLibraryWriteImageCompletionBlock)(NSURL *assetURL, NSError *error);
          

          如果您不知道如何获取&lt;AssetsLibrary/AssetsLibrary.h&gt;,请添加现有框架(AssetsLibrary.framework)

          【讨论】:

            【解决方案7】:

            我终于找到了答案。 显然 UIImage 方法会去除元数据,因此使用 UIImageWriteToSavedPhotosAlbum 并不好。

            然而,在 ios4 中,Apple 引入了一个新框架来处理名为 ALAssetsLibrary 的照片库。

            首先,您需要右键单击 Targets,然后在构建部分中,使用左下角的小 + 图标将 AlAsset 框架添加到您的项目中。

            然后将#import "AssetsLibrary/AssetsLibrary.h";添加到你的类的头文件中。

            终于可以使用下面的代码了:

            UIImage *viewImage = YOUR UIIMAGE  // --- mine was made from drawing context
            ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];  
            // Request to save the image to camera roll  
            [library writeImageToSavedPhotosAlbum:[viewImage CGImage] orientation:(ALAssetOrientation)[viewImage imageOrientation] completionBlock:^(NSURL *assetURL, NSError *error){  
                if (error) {  
                    NSLog(@"error");  
                } else {  
                        NSLog(@"url %@", assetURL);  
                }  
            }];  
            [library release];
            

            这会得到你刚刚保存的文件的路径。

            【讨论】:

            • 如何加载该图像?我可以从图库中加载图像吗?任何人都可以发布代码来加载它吗?
            • ALAssetsLibrary 在 iOS 9.0+ 中已弃用。而是使用 PHPhotoLibrary 和“performChanges”方法将图像保存到设备。
            • 这条评论需要更多的支持,花了几个小时来实现它并让一切正常,现在必须使用更新的 API 重写它。
            • 您能给我们举个例子,说明如何使用 PHPhotoLibrary 和“performChanges”吗?
            【解决方案8】:
            - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)img editingInfo:(NSDictionary *)editInfo {
            
                RandomIndexnew = arc4random() % 3;
                if(RandomIndexnew == 0)
                {
                    nameStr =[NSString stringWithFormat:@"jpg"];
                    textFieldNormalFile_type.text =[NSString stringWithFormat:@"jpg"];
                }
                else if(RandomIndexnew = 1)
                {
                    nameStr =[NSString stringWithFormat:@"gif"];
                    textFieldNormalFile_type.text =[NSString stringWithFormat:@"GIF"];
                }
                else if(RandomIndexnew = 2)
                {
                    nameStr =[NSString stringWithFormat:@"jpg"];
                    textFieldNormalFile_type.text =[NSString stringWithFormat:@"JPG"];
                }
            
                RandomIndex = arc4random() % 20;
                NSString *nameStr1 =[NSString stringWithFormat:@"Image%i",RandomIndex];
                textFieldNormalFile_name.text =[NSString stringWithFormat:@"%@.%@",nameStr1,nameStr];
            
                newFilePath = [NSHomeDirectory() stringByAppendingPathComponent: textFieldNormalFile_name.text];
                imageData = UIImageJPEGRepresentation(img, 1.0);
                if (imageData != nil) {
                    NSLog(@"HERE [%@]", newFilePath);
                    [imageData writeToFile:newFilePath atomically:YES];
                }
                image.image =[UIImage imageNamed:newFilePath];
                NSLog(@"newFilePath:%@",newFilePath);
                path.text =[NSString stringWithFormat:newFilePath];
                NSLog(@"path.text :%@",path.text);
            }
            

            【讨论】:

            • 我正在自己的应用程序中实现此代码并且它正在工作..您可以修改自己的代码来实现它。希望对你有帮助。
            猜你喜欢
            • 1970-01-01
            • 2013-02-21
            • 2011-11-07
            • 1970-01-01
            • 1970-01-01
            • 2012-12-01
            • 1970-01-01
            • 2015-11-30
            • 1970-01-01
            相关资源
            最近更新 更多