如何从 PHAsset 获取图像 URL?是不是可以使用 PHAsset URL 将图像保存到文档目录?

Posted

技术标签:

【中文标题】如何从 PHAsset 获取图像 URL?是不是可以使用 PHAsset URL 将图像保存到文档目录?【英文标题】:How To get Image URL From PHAsset? Is it possible To save Image using PHAsset URL to document Directory?如何从 PHAsset 获取图像 URL?是否可以使用 PHAsset URL 将图像保存到文档目录? 【发布时间】:2017-06-10 10:09:25 【问题描述】:

我用过

  `NSURL *urlA = [info valueForKey:@"PHImageFileURLKey"];`

但是当我尝试使用 URL 保存图像时,URL 为零。

 `NSData *pngData =[NSData dataWithContentsOfURL:urlA options:NSDataReadingMapped error:nil];`

【问题讨论】:

检查我的答案希望你的答案很清楚 【参考方案1】:

你可以从PHContentEditingInput获取imageURL:

斯威夫特:

asset.requestContentEditingInput(with: PHContentEditingInputRequestOptions())  (eidtingInput, info) in
  if let input = eidtingInput, let imgURL = input.fullSizeImageURL 
     // imgURL 
  

目标-C:

[asset requestContentEditingInputWithOptions:[PHContentEditingInputRequestOptions new] completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) 
    NSURL *imageURL = contentEditingInput.fullSizeImageURL;
];

【讨论】:

@a-tuo 请用 Objective-C 回答,因为我不知道 Swift @KeyurAspiration 你有没有在plist中添加“隐私-照片库使用说明”键以获得访问照片的权限? @a-tuo 是的,我已经给出了这个“隐私 - 照片库使用说明” 不适合我 (ios 14.4) PHImageFileURLKey 不包含在字典中。 如果图片不在本地,'isNetworkAccessAllowed'的属性需要设置为true。查看完整代码:let requestOptions = PHContentEditingInputRequestOptions() requestOptions.isNetworkAccessAllowed = true asset.requestContentEditingInput(with: requestOptions) (editingInput, info) in 【参考方案2】:

asset = 在这里你必须传递你的 PHAsset 。

PHImageRequestOptions * imageRequestOptions = [[PHImageRequestOptions alloc] init];
 [[PHImageManager defaultManager]
             requestImageDataForAsset:asset
                            options:imageRequestOptions
                      resultHandler:^(NSData *imageData, NSString *dataUTI,
                                      UIImageOrientation orientation, 
                                      NSDictionary *info) 
     
          NSLog(@"info = %@", info);
          if ([info objectForKey:@"PHImageFileURLKey"]) 

               NSURL *path = [info objectForKey:@"PHImageFileURLKey"];
               // if you want to save image in document see this.
               [self saveimageindocument:imageData withimagename:[NSString stringWithFormat:@"DEMO"]];
                                                      
    ];

-(void) saveimageindocument:(NSData*) imageData withimagename:(NSString*)imagename

    NSString *writePath = [NSString stringWithFormat:@"%@/%@.png",[Utility getDocumentDirectory],imagename];

    if (![imageData writeToFile:writePath atomically:YES]) 
        // failure
        NSLog(@"image save failed to path %@", writePath);

     else 
        // success.
        NSLog(@"image save Successfully to path %@", writePath);
    


+ (NSString*)getDocumentDirectory 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    return [paths objectAtIndex:0];

检查图像是横向模式还是纵向模式

if (chooseimage.size.height >= chooseimage.size.width)

         Islandscape = NO;
else
     UIImage* landscapeImage = [UIImage imageWithCGImage:chooseimage.CGImage
                                                      scale:chooseimage.scale
                                                orientation:UIImageOrientationLeft];
        self.imgPreviewView.image = landscapeImage;
        self.imgPreviewView.contentMode = UIViewContentModeScaleAspectFill;
        Islandscape = YES;
 

将此权限添加到 info.plist 文件中

<key>NSPhotoLibraryUsageDescription</key>
<string>$(PRODUCT_NAME) would like to access your photo library to let you select a picture.</string>

【讨论】:

感谢您的回答,我尝试了您的回答,但我在 log::setting security information: Operation not allowed 上收到此类型错误打印,并且我尝试将图像从 Phasset URL 保存到文档 Direcory,但我得到了错误 - 由于安全原因不允许访问。 您必须在 info.plist 文件中添加我在答案中添加的一件事。 @KeyurAspiration 我已经在 info.plist 中添加了 Photo,Camera,MicroPhone Description Access 等其他方式的图像数组保存到文档目录而没有内存警告问题。所以请告诉我。跨度> @KeyurAspiration 检查我更新的将图像存储在文件夹中的答案 图片未从服务器获取,而是使用图片选择器库从照片库中挑选出来的。【参考方案3】:

//这是使用Himanshu Moradiya的PHAsset答案获取图像URL的完整Swift代码

  let imageRequestOptions = PHImageRequestOptions()
  PHImageManager.default().requestImageData(for: currentAsset, options: imageRequestOptions, resultHandler:  imageData, dataUTI, orientation, info in
    if let info = info 
      print("info = \(info)")
    
    if info?["PHImageFileURLKey"] != nil 

      let path = info?["PHImageFileURLKey"] as? URL
       print(path) //here you get complete URL


      // if you want to save image in document see this.
     // self.saveimageindocument(imageData, withimagename: "DEMO")
    
  )

【讨论】:

以上是关于如何从 PHAsset 获取图像 URL?是不是可以使用 PHAsset URL 将图像保存到文档目录?的主要内容,如果未能解决你的问题,请参考以下文章

如何从视频 URL 获取视频的 PHAsset?

使用本地图像 URL 或 UIIMage 获取 PHAsset?

如何获取图像的路径?

照片框架 - 如何从 PHAsset 获取图像的 CLLocation?

如何从 PHAsset 获取原始图像和媒体类型?

如何检索 PHAsset 的元数据?