下面两种方法调整大小的结果有什么区别?
使用 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()
使用 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/