- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
我正在使用下面的代码来获取图像:
[[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/
我是 iOS 8 的新手,我想使用 photoKit 编辑输入图像,例如模糊、旋转、颜色变化、创建渐变等。我已经搜索过,没有教程,所以请分享详细的想法。提前致谢。 最佳答案 浏览解释照片框架的 WWD
有什么方法可以保留用户在“照片”应用中排列所有相册的列表顺序?我一整天都在尝试解决这个问题,但我似乎无法弄清楚我缺少什么来保留在我的应用程序中显示的顺序。 我想保留顺序,因为用户可以在照片应用中重新排
我第一次开始尝试 macOS 开发。我正在尝试查询我在 macOS 照片应用程序中创建的智能相册列表。正如您在此屏幕截图中看到的,我定义了 18 个智能相册和 1 个常规相册。 但是,当我获取智能相册
我第一次开始尝试 macOS 开发。我正在尝试查询我在 macOS 照片应用程序中创建的智能相册列表。正如您在此屏幕截图中看到的,我定义了 18 个智能相册和 1 个常规相册。 但是,当我获取智能相册
我正在使用 PhotoKit 来获取其中一个系统相册中的照片,如下所示: PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init]; f
我了解如何使用 Apple 的 PhotoKit API 以编程方式创建文件夹并将照片添加到该文件夹。 PHPhotoLibrary.shared().performChanges({
我正在使用 iOS 8 和新的 PhotoKit 开发一个 iOS 应用程序,我遍历用户图像并试图通过代码找出图像是垂直的还是水平的? Assets 上有我可以检查的标志吗? 最佳答案 您可以使用 r
我目前正在使用 ALAsset 框架将图像从照片库保存到带有元数据的文档目录中。我使用的代码是 ALAssetsLibrary *library = [[[ALAssetsLibrary alloc]
我可以使用 PHFetchResult *results = [PHCollectionList fetchTopLevelUserCollectionsWithOptions:nil]; 获取在设备
我正在使用 PhotoKit 从系统相册中获取照片并将它们放入 UICollectionView 中。 对于 UICollectionViewCell,我这样设置: cell.imageView.co
以下代码通过 3 个简单步骤突出显示了该问题: 1) 获取时刻 2)缓存时刻localIdentifier 3) 使用标识符获取时刻:失败(在设备上,iOS 8.2) - ( void )moment
我在更新图像的元数据并将其保存回照片库时遇到问题。一切工作除了图像元数据在它被改变之后缺少之前存在的条目并且我在处理图像或执行照片库更改 block 时没有收到任何错误。此外,在将字典写回图像之前,字
我正在尝试使用照片框架重现原生 iOS8 的照片选择器。我在排序时遇到了问题。 假设我执行以下操作: 我在 Camera+ 应用程序中编辑照片并将其保存回图库。 我收藏了另一张照片。 在 native
当我打印 PHAsset 的描述时,它包括 assetSource=3 或 assetSource=0。 我可以知道这是什么吗assetSource 是什么意思?像 3,0 这样的数字与什么有关?根据
我想从视频资源中提取 UIimage,用作海报。根据 PHImageManager 的文档,我应该能够使用 requestImageForAsset:targetSize:contentMode:op
我使用方法(这个问题的结尾)从设备中检索视频。它的作用是在库中找到第一个视频,创建导出 session 并将视频导出到 MOV 文件中。 应用程序运行两次后(在方法运行之间停止应用程序),将比较两个生
我正在开发 iOS 8 应用程序并处理大量照片,我需要唯一标识 PHassets 但找不到任何可用的属性?我找到一处特性在 PHObject/localIdentifier 记录在这里 https:
我正在使用下面的代码来获取图像: [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:CGSizeMake(8
我在理解如何为 photokit 查询制定文件管理器时遇到了很多麻烦,特别是当您只想检索某些媒体类型时如何制定 NSPredicate。就我而言,我正在尝试检索所有相册(即 PHCollectionA
我是否可以使用从 "PHImageFileURLKey" 返回的路径进入照片库并检索图像? 返回的路径格式如下: "file:///var/mobile/Media/DCIM/102APPLE/IMG
我是一名优秀的程序员,十分优秀!