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


    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/10224065.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    目录:[Swift]通天遁地Swift

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

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

    点击【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( 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 }
  • 相关阅读:
    cf1009 D. Relatively Prime Graph
    cf1009 C. Annoying Present
    随机验证码(数字和字母组成)及toLowerCase() 字符串转小写方法和toUpperCase()字符串转大写方法
    js中new ActiveXObject("Scripting.FileSystemObject")等操作本地文件用法,
    上传文件 (图片),使用new FormData()
    jq分页插件(jquery.pagination.js)只有上一页下一页和跳转
    jq的分页插件(pagination.min.js)选择一页显示多少条数据
    左侧导航栏案例
    jQuery 事件总结
    WebSocket
  • 原文地址:https://www.cnblogs.com/strengthen/p/10224065.html
Copyright © 2020-2023  润新知