[Swift通天遁地]四、网络和线程-(10)处理图片:压缩、缩放、圆角、CoreImage滤镜、缓存
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/10224065.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
本文将演示在第三方类库中,用来处理图片的一些强大功能。
首先确保在项目中已经安装了所需的第三方库。
点击【Podfile】,查看安装配置文件。
1 platform :ios, ’12.0’ 2 use_frameworks! 3 4 target 'DemoApp' do 5 source 'https://github.com/CocoaPods/Specs.git' 6 pod 'Alamofire', '~> 4.0' 7 pod 'AlamofireImage', '~> 3.1' 8 end
根据配置文件中的相关配置,安装第三方库。
然后点击打开【DemoApp.xcworkspace】项目文件。
在项目导航区,打开视图控制器的代码文件【ViewController.swift】
现在开始编写代码,实现图片处理功能。
1 import UIKit 2 //在当前的类文件中,引入已经安装的第三方类库 3 import Alamofire 4 import AlamofireImage 5 6 class ViewController: UIViewController { 7 8 var imageView : UIImageView? 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 // Do any additional setup after loading the view, typically from a nib. 13 //下载并显示图片 14 downloadImage() 15 16 //膨胀和恢复被压缩图片的数据 17 inflationImage() 18 19 //使用第三方类库,实现图片缩放的功能 20 scalingImage() 21 22 //使用第三方类库,实现图片圆角 23 roundedCorners() 24 25 //使用第三方类库,给图片添加棕褐色调的滤镜,从而实现老旧照片的效果 26 coreImageFilters() 27 28 //使用第三方类库,对下载后的图片进行缓存处理 29 cacheImages() 30 } 31 32 //添加一个方法,用来下载一张网络图片,并在模拟器种显示下载的图片。 33 func downloadImage() 34 { 35 //调用网络操作库的下载方法,下载指定的服务器接口, 36 //并返回一张图片。 37 Alamofire.request("https://httpbin.org/image/png").responseImage 38 { 39 response in 40 //在控制台输出:网络返回对象 41 debugPrint(response) 42 //在控制台输出:网络请求对象 43 print(response.request) 44 //在控制台输出:网络返回对象 45 print(response.response) 46 //在控制台输出:网络返回的结果 47 debugPrint(response.result) 48 49 //获得服务器返回的图片 50 if let image = response.result.value 51 { 52 //并在控制台输出图片的信息 53 print("image downloaded: \(image)") 54 55 //获得根视图显示区域的尺寸 56 let size = self.view.bounds.size 57 //创建一个图像视图 58 self.imageView = UIImageView(image: image) 59 //并将图像视图放在根视图的中心位置 60 self.imageView?.center = CGPoint(x: size.width/2, y: size.height/2) 61 62 //将图像视图添加到根视图中 63 self.view.addSubview(self.imageView!) 64 } 65 } 66 } 67 68 //添加一个方法,用来膨胀和恢复被压缩图片的数据, 69 //该操作可以明显提高图片的渲染效率 70 func inflationImage() 71 { 72 //获得项目中的图片所在的路径 73 let url = Bundle.main.url(forResource: "Girl", withExtension: "png")! 74 //读取指定名称的图片,并转换为数据格式 75 let data = try! Data(contentsOf: url) 76 //根据图片的数据,初始化一个图片对象 77 let image = UIImage(data: data, scale: UIScreen.main.scale)! 78 79 //执行图片对象的扩展方法,实现对压缩图片的恢复。 80 //当图片较大时,最好新建一个线程以执行该方法。 81 image.af_inflate() 82 83 //获得根视图的显示区域的尺寸 84 let size = self.view.bounds.size 85 //创建一个图像视图,用来显示处理后的图片 86 self.imageView = UIImageView(image: image) 87 //将图像视图放置在根视图的中心位置 88 self.imageView?.center = CGPoint(x: size.width/2, y: size.height/2) 89 //将图像视图添加到根视图中 90 self.view.addSubview(self.imageView!) 91 } 92 93 //添加一个方法,使用第三方类库,实现图片缩放的功能 94 func scalingImage() 95 { 96 //从项目中读取一张图片 97 let image = UIImage(named: "Girl")! 98 //初始化一个尺寸,作为缩放后的图片尺寸 99 let imageSize = CGSize(width: 100, height: 100) 100 101 //调用图片的缩放方法,将图片缩小至指定的尺寸 102 //方法1.缩放样式:缩小 103 //let scaledImage = image.af_imageScaled(to: imageSize) 104 105 //方法2.缩放样式:宽度和高度进行等比例的变化 106 //let aspectScaledToFitImage = image.af_imageAspectScaled(toFit: imageSize) 107 108 //方法3.宽度和高度进行等比例的变化,并且尽可能的充满指定的尺寸 109 let aspectScaledToFillImage = image.af_imageAspectScaled(toFill: imageSize) 110 111 //获得根视图的矩形显示区域的尺寸 112 let size = self.view.bounds.size 113 //创建一个图像视图,用来显示缩放后的图片 114 self.imageView = UIImageView(image: aspectScaledToFillImage) 115 //将图像视图放置在根视图的中心位置 116 self.imageView?.center = CGPoint(x: size.width/2, y: size.height/2) 117 //将图像视图添加到根视图中 118 self.view.addSubview(self.imageView!) 119 } 120 121 //添加一个方法,使用第三方类库,实现图片圆角 122 func roundedCorners() 123 { 124 //从项目中读取一张图片 125 let image = UIImage(named: "Giraffe")! 126 //设置圆角半径大小 127 let radius: CGFloat = 20.0 128 129 //调用图片的扩展方法,将图片进行圆角处理 130 //let roundedImage = image.af_imageRounded(withCornerRadius: radius) 131 132 //调用图片的扩展方法从圆角至圆形,创建一个圆形图片 133 let circularImage = image.af_imageRoundedIntoCircle() 134 135 //获得根视图的矩形显示区域的尺寸 136 let size = self.view.bounds.size 137 //创建一个图像视图,用来显示添加圆角后的图片 138 self.imageView = UIImageView(image: circularImage) 139 //将图像视图放置在根视图的中心位置 140 self.imageView?.center = CGPoint(x: size.width/2, y: size.height/2) 141 //将图像视图添加到根视图中 142 self.view.addSubview(self.imageView!) 143 } 144 145 //添加一个方法,使用第三方类库,给图片添加棕褐色调的滤镜,从而实现老旧照片的效果 146 func coreImageFilters() 147 { 148 //从项目中读取一张图片 149 let image = UIImage(named: "Family")! 150 151 //调用图片的扩展方法,给图片添加棕褐色调的滤镜, 152 //let sepiaImage = image.af_imageFiltered(withCoreImageFilter: "CISepiaTone") 153 //记得指定给图像视图self.imageView = UIImageView(image: sepiaImage) 154 155 //模糊滤镜效果 156 //设置模糊滤镜的类型为动态模糊,以及输入半径和输入角度两个参数 157 let blurredImage = image.af_imageFiltered(withCoreImageFilter: "CIMotionBlur",//滤镜类型:动态模糊 158 parameters: ["inputRadius": 10,//输入半径 159 "inputAngle":45]//输入角度 160 ) 161 162 //获得根视图的矩形显示区域的尺寸 163 let size = self.view.bounds.size 164 //创建一个图像视图,用来显示添加滤镜后的图片 165 self.imageView = UIImageView(image: blurredImage) 166 //将图像视图放置在根视图的中心位置 167 self.imageView?.center = CGPoint(x: size.width/2, y: size.height/2) 168 //将图像视图添加到根视图中 169 self.view.addSubview(self.imageView!) 170 } 171 172 //添加一个方法,使用第三方类库,对下载后的图片进行缓存处理 173 func cacheImages() 174 { 175 //设置缓存区域大小为100M 176 //当缓存内容超过100M时,将自动清除缓存中的内容, 177 //直到缓存区域的剩余空间达到60M为止。 178 let imageCache = AutoPurgingImageCache( 179 memoryCapacity: 100_000_000, 180 preferredMemoryUsageAfterPurge: 60_000_000) 181 182 //创建一个网络请求对象,下载指定位置的网络图片 183 let urlRequest = URLRequest(url: URL(string: "https://httpbin.org/image/png")!) 184 185 //调用网络操作库的下载方法,下载指定的服务器接口, 186 //并返回一张图片。 187 Alamofire.request("https://httpbin.org/image/png").responseImage 188 { 189 response in 190 //将下载后的数据转换成一张图片 191 if let image = response.result.value 192 { 193 //将下载的图片进行缓存,并设置缓存图片的网络请求和标识符 194 imageCache.add(image, for: urlRequest, withIdentifier: "circleImage") 195 196 //当需要再次下载位于同一网址的图片时,只需要指定它的网络请求和标识符, 197 //即可从缓存中加载图片,而无需重复下载。 198 let cachedAvatarImage = imageCache.image(for: urlRequest, withIdentifier: "circleImage") 199 200 //创建一个图像视图,用来显示缓存后的图片 201 self.imageView = UIImageView(image: cachedAvatarImage) 202 //将图像视图放置在根视图的中心位置 203 self.imageView?.center = self.view.center 204 //将图像视图添加到根视图中 205 self.view.addSubview(self.imageView!) 206 207 //当不需要缓存某张图片时,只需要调用缓存对象的益处图片功能即可。 208 imageCache.removeImage(for: urlRequest, withIdentifier: "circleImage") 209 } 210 } 211 } 212 213 override func didReceiveMemoryWarning() { 214 super.didReceiveMemoryWarning() 215 // Dispose of any resources that can be recreated. 216 } 217 }