gpt4 book ai didi

ios - 如何获取 iOS8 PhotoKit 请求的图像大小?

转载 作者:技术小花猫 更新时间:2023-10-29 10:42:42 25 4
gpt4 key购买 nike

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

[[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 获取请求的图像大小?

最佳答案

您的(Unnati 的) self 回答会起作用,但是它错过了 Apple 在其框架中为您提供的一些优化,这些优化可以更快地为您显示图像。

您的原始代码几乎是正确的,但是您包含了一个您可能不需要的 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));
}];

这应该更简单,并为您提供 Apple 免费提供的所有优化框架。以下是对您得到的内容的解释:

使用低质量图像快速响应

该框架将多次调用您的结果处理程序并提高图像质量,允许您在用户等待最终图像时向他们显示一些内容。来自 the documentation :

Photos may call your result handler block more than once. Photos first calls the block to provide a low-quality image suitable for displaying temporarily while it prepares a high-quality image. (If low-quality image data is immediately available, the first call may occur before the method returns.) When the high-quality image is ready, Photos calls your result handler again to provide it.

这意味着您的 resultHandler block 需要安全才能多次调用 - 您代码中的 block 只是记录大小,对于我的测试图像,我首先收到两条日志消息一个是低质量的 40x26 像素图像,然后是一个高质量图像。如果您打开 iOS 照片应用程序,您可以在它们看起来锐化之前非常短暂地看到低质量的图像 - 这就是这里发生的事情。

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

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

为了快速提供最终图像,框架将在对您的 resultHandler block 的最终调用中提供接近请求大小的图像(如果它已经缓存了一个图像)。如果您使用的 UIImageView 设置了 contentMode 的纵横比填充或适合,这不会有问题,只需指定匹配的 contentMode 在您的图片请求中。例如,针对我的测试图像,对我的 resultHandler 的第二次调用是使用 1280x850 图像,比我请求的大,但大致正确。但是,设置 options.resizeMode = PHImageRequestOptionsResizeModeExact 将阻止此行为并强制框架调整图像新副本的大小,而不是使用缓存副本,这需要时间。

由于 Photos 框架不会裁剪图像(即使您要求它这样做,但这是一个错误 ;-)),即使使用 PHImageRequestOptionsResizeModeExact选项。例如,如果您为不是 4:3 比例的图像请求 800x600,照片无法返回该尺寸的图像,它会尽可能接近 - 在我的最新图像上,这样的请求得到一张 800x531 的图片。这意味着您需要能够处理不是您请求的确切大小的图像,因此您不妨利用框架中的优化并避免使用 PHImageRequestOptionsResizeModeExact。来自 the documentation再次:

Resizing to exactly match a target size is less efficient than using the fast resizing option.

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

图像版本

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

关于ios - 如何获取 iOS8 PhotoKit 请求的图像大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26931023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com