[Swift通天遁地]4、網絡和線程-(10)處理圖片:壓縮、縮放、圓角、CoreImage濾鏡、緩存

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公衆號:山青詠芝(shanqingyongzhi)
➤博客園地址:山青詠芝(https://www.cnblogs.com/strengthen/
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:http://www.javashuo.com/article/p-pspoyfvu-kw.html 
➤若是連接不是山青詠芝的博客園地址,則多是爬取做者的文章。
➤原文已修改更新!強烈建議點擊原文地址閱讀!支持做者!支持原創!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★html

目錄:[Swift]通天遁地Swiftios

本文將演示在第三方類庫中,用來處理圖片的一些強大功能。git

首先確保在項目中已經安裝了所需的第三方庫。github

點擊【Podfile】,查看安裝配置文件。swift

1 platform :ios, ’12.02 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 }
相關文章
相關標籤/搜索