通过UIImage或PHImageManager调整图像大小

时间:2018-01-19 12:48:42

标签: ios swift uiimage

以下两种方法的调整大小结果有什么区别?

  1. 使用UIImage:

    let horizontalRatio = newSize.width / size.width
    let verticalRatio = newSize.height / size.height
    
    let ratio = max(horizontalRatio, verticalRatio)
    let newSize = CGSize(width: size.width * ratio, height: size.height * ratio)
    UIGraphicsBeginImageContextWithOptions(newSize, true, 0)
    draw(in: CGRect(origin: CGPoint(x: 0, y: 0), size: newSize))
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    
  2. 使用PHImageManager(带resizeMode = .exact):

    requestImage(for:targetSize:contentMode:options:resultHandler:)

  3. 据我所知,第二种方法仅适用于PHAsset类的图像。在图像质量,调整效率或内存使用方面还有其他差异吗?

2 个答案:

答案 0 :(得分:0)

我不能声称回答你的问题。但我的猜测是更喜欢requestImage方法。

在1中,您需要将上下文和将要绘制的图像加载到内存中。经过一些测试后,我注意到iOS在仅绘制部分图像或在较小的上下文中绘制时似乎没有加载整个图像,因此缺点并不大。

但是,2是一种优化的显示。它可能会调用结果处理程序块超过once。所以结果完全不同。

如果您只是需要调整图片大小,我建议您使用第三种解决方案:图像IO,cgimagesourcecreatewithdata经过优化,可以满足您的需求。

我向你推荐Nick Lockwood's talk

答案 1 :(得分:0)

考虑目的,这个问题可能是最好的答案。

UIImage和您使用它的UIGraphics调用是一次拍摄一张图片(您已经拥有全尺寸像素数据)并调整其大小。还有其他可能有用的方法可以做类似的事情,比如使用Core Image或Image I / O--使用哪种方式取决于你的像素数据的来源,你有多少,以及你可能做的其他什么用它。

照片框架,尤其是PHImageManager,专为希望从照片应用复制主要功能集的应用而设计 - 例如,构建自己的照片库浏览器,以便您的社交网络应用可以整合“将相机胶卷中的图像发布到您自己的用户界面”,而不是拉出全屏UIImagePickerController

想要构建照片浏览器的应用往往需要缩略图。并且他们倾向于希望缓存这些缩略图,这样他们就不必每次用户调出浏览器时重新生成它们(并从iCloud Photo Library重新下载完整大小的图像)。在照片框架出现之前发生的事情是,每个想要自己的照片浏览器的应用程序都会生成自己的缩略图缓存...因此用户可以拥有50 GB的照片库,在App A的沙箱中加1 GB的缩略图,另外1 GB App B的沙箱中的缩略图,依此类推,直到它们用完本地存储。 Photos框架和PHImageManager允许系统集中管理存储管理(包括iCloud)和缩略图生成等内容,因此所有应用都可以使用相同的缩略图缓存,并仅在需要时获取全尺寸资产。

照片使用PHAsset,因为它的许多任务都不涉及直接管理像素数据,它们涉及管理用户照片库中的项目。您可以使用PHAsset和相关API来确定所需的项目,然后使用PHImageManager获取它们的像素数据。您可以请求任意大小的像素数据 - 如果您只需要缩略图,您可能会获得缓存(更快,而无需管理自己的缓存)。