你(Unnati)的自我回答是可行的,但是它错过了苹果在其框架中为你提供的许多优化,这些优化可以让你更快地显示图像。
您的原始代码几乎是正确的,但是您包含了一个options
您可能不需要的对象,并且如果您设置了该对象,则可能会给您带来问题resizeMode
错误地在它上面。这是应该适合您的代码,我刚刚删除了您的选项对象。
[[PHImageManager defaultManager]
requestImageForAsset:(PHAsset *)asset
targetSize:CGSizeMake(800, 600)
contentMode:PHImageContentModeAspectFit
options:nil
resultHandler:^(UIImage *result, NSDictionary *info) {
NSLog(@"Image size:%@",NSStringFromCGSize(result.size));
}];
这应该更简单,并且为您提供苹果免费为其框架提供的所有优化。这是您得到的内容的解释:
使用低质量图像快速响应
该框架将多次调用您的结果处理程序,并提高图像质量,从而允许您在用户等待最终图像时向他们显示某些内容。从文档 https://developer.apple.com/library/IOs/documentation/Photos/Reference/PHImageManager_Class/index.html#//apple_ref/occ/instm/PHImageManager/requestImageForAsset:targetSize:contentMode:options:resultHandler::
照片可能会多次调用您的结果处理程序块。 Photos 首先调用块提供适合临时显示的低质量图像,同时准备高质量图像。 (如果低质量图像数据立即可用,则第一次调用可能会在该方法返回之前发生。)当高质量图像准备就绪时,Photos 会再次调用结果处理程序来提供它。
这意味着您的resultHandler
块需要安全地调用多次 - 代码中的块只是记录大小,对于我的测试图像,我收到两条日志消息,第一个带有低质量的 40x26 px 图像,然后再次带有高品质图像。如果您打开 iOS 照片应用程序,您可以在图像锐化之前短暂地看到低质量图像 - 这就是这里发生的情况。
Using options.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat
防止这种行为,并且您的resultHandler
只会在最终图像中调用一次,因此我建议不要设置此选项,除非您无法设计一个可以多次调用的处理程序块(在您的实际代码中)。
快速返回缓存的高质量图像
为了快速提供最终图像,框架将在最终调用中提供接近于请求大小的图像resultHandler
块,如果它已经缓存了一个。如果您使用的是UIImageView
设置有一个contentMode
方面填充或适合,这不会是一个问题,只需指定匹配contentMode
在您的图片请求中。例如,针对我的测试图像,第二次调用我的resultHandler
具有 1280x850 图像,比我要求的大,但大致正确。然而,设置options.resizeMode = PHImageRequestOptionsResizeModeExact
将防止这种行为并强制框架调整图像的新副本的大小,而不是使用缓存的副本,这需要时间。
由于照片框架不会裁剪图像(即使您要求它这样做,但这是一个错误;-)),因此即使使用PHImageRequestOptionsResizeModeExact
选项。例如,如果您请求 800x600 的图像比例不是 4:3,则“照片”无法返回该尺寸的图像,它只会尽可能接近 - 在我的最新图像上,这样的请求会得到800x531 的图像。这意味着您需要能够处理与您请求的确切尺寸不符的图像,因此您不妨利用框架中的优化并避免使用PHImageRequestOptionsResizeModeExact
. From 文档 https://developer.apple.com/library/IOs/documentation/Photos/Reference/PHImageRequestOptions_Class/index.html#//apple_ref/c/tdef/PHImageRequestOptionsResizeMode again:
调整大小以精确匹配目标大小的效率低于使用快速调整大小选项的效率。
(您是否已将其设置为PHImageRequestOptionsResizeModeFast
在你原来的options
对象,哪个未包含在问题中?这可能是导致您出现问题的原因。)
图片版本
可以请求图像的不同版本,就像您在自我回答中所做的那样options.version = PHImageRequestOptionsVersionCurrent
。但这不是必需的,因为默认版本是当前版本。