介绍下在iOS中的多种图片缩略方式
ref https://nshipster.com/image-resizing/
在UIKit CoreGraphics ImageIO CoreImage vImage
多种缩略方法中 Core Image表现最差。Core Graphics 和 Image I/O最好。
实际上,在苹果官方在 Performance Best Practices section of the Core Image Programming Guide 部分中特别推荐使用Core Graphics或Image I / O功能预先裁剪或缩小图像。
UIKit
UIGraphicsBeginImageContextWithOptions & UIImage -drawInRect:
用于图像大小调整的最高级API可以在UIKit框架中找到。给定一个UIImage,可以使用临时图形上下文来渲染缩放版本。这种方式最简
1 | func uikit_resize(oriImg:UIImage?,size:CGSize) -> UIImage?{ |
CoreGraphics
CGBitmapContextCreate & CGContextDrawImage
CoreGraphics / Quartz 2D提供了一套较低级别的API,允许进行更高级的配置。 给定一个CGImage,使用临时位图上下文来渲染缩放后的图像。
使用CoreGraphics图像的质量与UIKit图像相同。
1 | func coreGraphics_resize(oriImg:UIImage,size:CGSize)->UIImage?{ |
ImageIO
CGImageSourceCreateThumbnailAtIndex
Image I / O是一个功能强大但鲜为人知的用于处理图像的框架。 独立于Core Graphics,它可以在许多不同格式之间读取和写入,访问照片元数据以及执行常见的图像处理操作。 这个库提供了该平台上最快的图像编码器和解码器,具有先进的缓存机制,甚至可以逐步加载图像
1 | func imageIO_resize(url:URL,size:CGSize) -> UIImage? { |
CoreImage
里面提供了强大高效的图像处理功能,用来对基于像素的图像进行操作与分析。IOS提供了很多强大的滤镜(Filter),这些Filter提供了各种各样的效果,并且还可以通过滤镜链将各种效果的Filter叠加起来,形成强大的自定义效果,如果你对该效果不满意,还可以子类化滤镜。
1 | let sharedContext = CIContext(options: [.useSoftwareRenderer : false]) |
vImage
使用CPU的矢量处理器处理大图像。 强大的图像处理功能,包括Core Graphics和Core Video互操作,格式转换和图像处理。
1 | func vimage_resize(oriImg:UIImage,size:CGSize) -> UIImage? { |