Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 通过UIImage或PHImageManager调整图像大小_Ios_Swift_Uiimage - Fatal编程技术网

Ios 通过UIImage或PHImageManager调整图像大小

Ios 通过UIImage或PHImageManager调整图像大小,ios,swift,uiimage,Ios,Swift,Uiimage,下面两种方法的大小调整结果有什么不同 使用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 * rat

下面两种方法的大小调整结果有什么不同

使用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()
使用具有resizeMode=.exact的PHImageManager:

requestImagefor:targetSize:contentMode:options:resultHandler:


据我所知,第二种方法仅适用于Phaset类的图像。在图像质量、大小调整效率或内存使用方面还有其他区别吗?

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

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

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

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


关于这一点,我向您推荐最合适的答案。

这个问题最好考虑一下目的

UIImage和与之一起使用的UIGraphics调用用于在已经具有全尺寸像素数据的时间拍摄单个图像并调整其大小。还有其他可能有用的方法来做类似的事情,比如核心图像或图像I/O——使用哪种方法取决于像素数据来自何处,有多少像素数据,以及您可能对其进行的其他操作

Photos框架,尤其是PHImageManager,是为那些希望从Photos应用程序复制主要功能集的应用程序而设计的,例如,构建您自己的照片库浏览器,这样您的社交网络应用程序就可以将相机卷中的图像集成到您自己的UI中,而无需启动全屏UIImagePickerController

想要构建照片浏览器的应用程序往往需要缩略图。他们往往希望缓存这些缩略图,这样他们就不必在每次用户打开浏览器时重新生成缩略图并从iCloud照片库重新下载全尺寸图像。在照片框架出现之前,每个想要自己的照片浏览器的应用程序都会生成自己的缩略图缓存。。。因此,用户可以拥有一个50 GB的照片库,加上应用程序a的沙箱中的1 GB缩略图,再加上应用程序B的沙箱中的1 GB缩略图,以此类推,直到本地存储空间用完为止。照片框架和PHImageManager允许系统集中管理存储管理(包括iCloud和缩略图生成),因此所有应用程序都可以使用相同的缩略图缓存,并仅在需要时获取全尺寸资产

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