繁体   English   中英

通过UIImage或PHImageManager调整图像大小

[英]resize image by UIImage or PHImageManager

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

  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类的图像。 在图像质量,调整大小效率或内存使用方面是否还有其他差异?

考虑到目的,也许可以最好地回答这个问题。

与其一起使用的UIImageUIGraphics调用用于一次拍摄单个图像(您已经具有全尺寸像素数据)并调整其大小。 还有其他可能有用的方法来执行类似操作,例如使用Core Image或Image I / O –使用哪种方法取决于像素数据来自何处,像素数据的数量以及您可能要做什么?用它。

Photos框架(尤其是PHImageManager是为希望从“照片”应用程序中复制大部分功能集的应用程序设计的,例如,构建自己的照片库浏览器,以便您的社交网络应用程序可以集成“从相机胶卷”添加到您自己的UI中,而不是拉起全屏UIImagePickerController

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

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

我不能要求回答您的问题。 但是我的猜测是更喜欢requestImage方法。

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

但是,2是一种优化的显示。 它可能多次调用您的结果处理程序块。 因此结果是完全不同的。

如果您只需要调整图像大小,建议您使用第三个解决方案:图像IO, cgimagesourcecreatewithdata ,它经过优化可实现所需的功能。

我建议尼克·洛克伍德(Nick Lockwood)就此进行演讲

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM