1. 程式人生 > >[Swift通天遁地]四、網路和執行緒-(10)處理圖片:壓縮、縮放、圓角、CoreImage濾鏡、快取

[Swift通天遁地]四、網路和執行緒-(10)處理圖片:壓縮、縮放、圓角、CoreImage濾鏡、快取

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

首先確保在專案中已經安裝了所需的第三方庫。

點選【Podfile】,檢視安裝配置檔案。

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 }