[Swift通天遁地]四、网络和线程,10处理图片:压缩、缩放、圆角、CoreImage滤镜、缓存

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

➤微信公众号:山青咏芝(shanqingyongzhi)

➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/

➤GitHub地址:https://github.com/strengthen/LeetCode

➤原文地址:

➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。

➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

热烈欢迎,请直接点击!!!

进入博主App Store主页,下载使用各个作品!!!

注:博主将坚持每月上线一个新app!!!

目录:[Swift]通天遁地Swift

本文将演示在第三方类库中,用来处理图片的一些强大功能。

首先确保在项目中已经安装了所需的第三方库。

点击【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 }