ios - 通过 UIImage 或 PHImageManager 调整图像大小

标签 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:)

据我所知,第二种方法只适用于 PHAsset 类的图像。在图像质量、缩放效率或内存使用方面是否还有其他差异?

最佳答案

也许最好通过考虑目的来回答这个问题。

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

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

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

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

关于ios - 通过 UIImage 或 PHImageManager 调整图像大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48341515/

相关文章:

iphone - 如何在 iPhone 的下拉框中选择多个项目并显示在文本框中?

ios - Core Data 和 Swift 中的计算属性与持久存储

ios - 将图像添加到ios工具栏的UIBarButtonItem

ios - SWIFT - 如何修复回调发生得太晚

ios - 如何在iPhone上的xmpp中获取用户组?

swift - 如何使用 Alamofire Image 在 ImageView 上快速添加 UIActivity Indicator

swift - 谷歌地图捕捉到步行的道路 - swift

ios - 加载保存到文档目录的图像只能工作一次,然后再也不会加载

iphone - 拉伸(stretch) UIImage 同时保留角点

ios - 将文件上传到 Dropbox 中的特定文件夹