首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为iOS8 PhotoKit获取所需的图像大小?

如何为iOS8 PhotoKit获取所需的图像大小?
EN

Stack Overflow用户
提问于 2014-11-14 13:23:53
回答 2查看 5.1K关注 0票数 13

我使用下面的代码获取图像:

代码语言:javascript
复制
[[PHImageManager defaultManager] requestImageForAsset:asset 
targetSize:CGSizeMake(800, 600) 
contentMode:PHImageContentModeAspectFill 
options:options 
resultHandler:^(UIImage *result, NSDictionary *info) {
    NSLog(@"size:%@",NSStringFromCGSize(result.size));                
}];

我要求的图像大小为800 x 600,但我得到的图像大小为45 x 60,这是非常糟糕的质量。

如何使用PhotoKit获取所请求的图像大小

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-14 13:41:22

我能够使用下面的代码获得大小为800*600的图像:

代码语言:javascript
复制
PHImageRequestOptions* options = [[[PHImageRequestOptions alloc] init] autorelease];
options.version = PHImageRequestOptionsVersionCurrent;
options.deliveryMode =  PHImageRequestOptionsDeliveryModeHighQualityFormat;
options.resizeMode = PHImageRequestOptionsResizeModeExact;

[PHImageManager defaultManager]
requestImageForAsset:(PHAsset *)asset
targetSize:CGSizeMake(800, 600)
contentMode:PHImageContentModeAspectFit
options:options
resultHandler:^(UIImage *result, NSDictionary *info) {
   NSLog(@"Image size:%@",NSStringFromCGSize(result.size));
}];

如果您想获得完整大小的图像,可以使用PHImageManagerMaximumSize作为targetSize。

票数 15
EN

Stack Overflow用户

发布于 2014-11-15 07:29:05

您的(Unnati)自我答案将有效,但它错过了一些优化,苹果给你在他们的框架,为你获取图像更快显示。

您的原始代码是相当正确的,但是您包含了一个您可能不需要的options对象,如果您在它上设置了错误的resizeMode,可能会导致问题。下面是您应该使用的代码,我刚刚删除了options对象。

代码语言:javascript
复制
[[PHImageManager defaultManager]
 requestImageForAsset:(PHAsset *)asset
 targetSize:CGSizeMake(800, 600)
 contentMode:PHImageContentModeAspectFit
 options:nil
 resultHandler:^(UIImage *result, NSDictionary *info) {
     NSLog(@"Image size:%@",NSStringFromCGSize(result.size));
 }];

这应该更简单,并给你所有的优化苹果公司提供的框架免费。以下是你得到的解释:

用低质量的图像快速响应

该框架将多次调用结果处理程序,增加质量的图像,允许您在用户等待最终图像时向用户显示某些内容。来自文献资料

照片可能会多次调用结果处理程序块。照片首先调用块,以提供适合于临时显示的低质量图像,同时准备高质量的图像。(如果立即可用低质量的图像数据,则可能在该方法返回之前进行第一次调用。)当高质量的图像准备好后,Photos再次调用您的结果处理程序来提供它.

这意味着您的resultHandler块需要安全地调用不止一次--代码中的块只是记录大小,对于我的测试映像,我得到两条日志消息,第一条带有低质量的40x26 px映像,然后再用高质量的映像。如果你打开iOS照片应用程序,你可以看到低质量的图像之前,他们看起来锐化-这就是正在发生的事情。

使用options.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat可以防止这种行为,并且您的resultHandler只会在最终映像中被调用一次,所以我建议不要设置此选项,除非您无法设计一个可以多次调用的处理程序块(在实际代码中)。

快速返回高速缓存的高质量图像

要快速提供最终映像,框架将在对resultHandler块的最后调用中提供接近请求大小的图像,如果它已经缓存了一个。如果您使用的UIImageView集具有一个方面填充或fit的contentMode,这将不是问题,只需在图像请求中指定匹配的contentMode即可。例如,对于我的测试映像,对我的resultHandler的第二个调用是使用一个1280x850映像,比我请求的要大,但大致是正确的。但是,设置options.resizeMode = PHImageRequestOptionsResizeModeExact将防止这种行为,并迫使框架调整图像的新副本的大小,而不是使用缓存的副本,这需要时间。

由于Photos框架不裁剪图像(即使您请求它,但这是一个bug;-),所以即使使用PHImageRequestOptionsResizeModeExact选项,也不一定能得到所需的确切大小。例如,如果您请求800x600的图像不是以4:3的比例,Photos不能返回该大小的图像,它就会尽可能地接近它--在我的最新图像上,这样的请求会得到800x531的图像。这意味着您需要能够处理与您所要求的图像大小不同的图像,所以您最好利用框架中的优化,避免使用PHImageRequestOptionsResizeModeExact。再次来自文献资料

与使用快速调整大小选项相比,调整大小以精确匹配目标大小的效率较低。

(您是否在原始的PHImageRequestOptionsResizeModeFast对象中将此设置为options,该对象未包含在问题中?这可能导致了你的问题。)

图像版本

可以请求不同版本的图像,就像您在使用options.version = PHImageRequestOptionsVersionCurrent时所做的那样。但是,这是不需要的,因为默认的是当前版本。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26931023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档