测试环境:XCode 9.2 / 模拟器 6s - iOS 11.2
1. synchronous = YES. 同步。只返回一张图片并且deliveryMode会忽略用户设置的值,直接设为 PHImageRequestOptionsDeliveryModeHighQualityFormat。
a. resizeMode: PHImageRequestOptionsResizeModeNone: 返回的是原图大小
b. resizeMode: PHImageRequestOptionsResizeModeFast: 当原图是压缩图时,会使用targetSize来最优解码图片,获得的图片大小可能比targetSize大
c. resizeMode: PHImageRequestOptionsResizeModeExact: 解压和Fast一样,但是返回的是指定targetSize的高质量图
2. synchronous: NO. 异步。
a. deliveryMode: PHImageRequestOptionsDeliveryModeOpportunistic: 会返回多张图片
1). PHImageRequestOptionsResizeModeNone: 先返回低清的缩略图,再返回原图大小
2). PHImageRequestOptionsResizeModeFast: 先返回低清的缩略图,再返回的图片如 1-b 一样
3). PHImageRequestOptionsResizeModeExact: 先返回低清的缩略图,再返回的图片如 1-c一样
b. deliveryMode: PHImageRequestOptionsDeliveryModeHighQualityFormat: 只会返回一张高清图片
1). PHImageRequestOptionsResizeModeNone: 如 1-a 一样
2). PHImageRequestOptionsResizeModeFast: 如 1-b 一样
3). PHImageRequestOptionsResizeModeExact: 如 1-c一样
c. deliveryMode: PHImageRequestOptionsDeliveryModeFastFormat: 只会返回一张图片,并且可能是低清图
1). PHImageRequestOptionsResizeModeNone: 返回一张低清图
2). PHImageRequestOptionsResizeModeFast: 返回一张低清图
3). PHImageRequestOptionsResizeModeExact: 返回一张低清图
复制代码
上述测试结果是在 requestImageForAsset:targetSize:contentMode:options:resultHandler: 方法中的 contentMode 为 PHImageContentModeAspectFit,targetSize 是按照图片的像素大小、屏幕宽度和屏幕分辨率计算的比例所得到的。如下:
CGFloat aspectRatio = asset.pixelWidth / (CGFloat)asset.pixelHeight;
CGFloat pixelWidth = kScreenWidth * kScreenScale;
CGFloat pixelHeight = pixelWidth / aspectRatio;
CGSize targetSize = CGSizeMake(pixelWidth, pixelHeight);
复制代码
如果 targetSize 不是如上计算结果的比例尺寸,而是随意设置,并且 contentMode 为 PHImageContentModeAspectFill 的话,则得到的图片可能会变形。如果 contentMode 为 PHImageContentModeAspectFit 时,则会根据 targetSize、deliveryMode、resizeMode 设置的值等比缩放。