如何从 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 或 UIIMage 获取 PHAsset?