zoukankan      html  css  js  c++  java
  • swift简单处理调用高清大图导致内存暴涨的情况

    开发中,通常需要用到使用选取多张图片的功能,但是高清大图很吃内存,我想到的处理方案就是拿到高清大图的时候,重新绘制一张小的图片使用.至于清晰度尚可,至少我是分辨不出多大区别.

    基本思路就是先固定宽,然后根据宽高比重新绘制一张新图片使用,大致代码如下:

    为UIImage写一个extention,方便调用

    import UIKit
    
    extension UIImage{
        //根据传入的宽度生成一张按照宽高比压缩的新图片
        func imageWithScale(CGFloat) -> UIImage{
           //1.根据 宽度 计算高度
            let height = width * size.height / size.width
          //2.按照宽高比绘制一张新的图片
            let currentSize = CGSize.init( width, height: height)
            UIGraphicsBeginImageContext(currentSize)  //开始绘制
             draw(in: CGRect.init(origin: CGPoint.zero, size: currentSize))
            let newImage = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()  //结束上下文
            return newImage!
        }
    }
    

      控制器代码:

    import UIKit
    var identifier = "cell"
    private var imgAry = [UIImage]()
    
    class ViewController: UIViewController{
        @IBOutlet weak var btn: UIButton!
        @IBOutlet weak var colectionView: UICollectionView!
            override func viewDidLoad() {
            super.viewDidLoad()
            colectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: identifier)
            colectionView.delegate = self
            colectionView.dataSource = self
            // Do any additional setup after loading the view, typically from a nib.
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
        //选择 按钮点击事件 弹出相册
        @IBAction func btnAction(_ sender: UIButton) {
            let vc = UIImagePickerController()
            vc.delegate = self
            present(vc, animated: true, completion: nil)
        }
    
    
    
    }
    
    extension ViewController:UICollectionViewDelegate,UICollectionViewDataSource,UINavigationControllerDelegate,UIImagePickerControllerDelegate{
        public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int{
            return imgAry.count
        }
    
    
        public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell{
            let cell = colectionView.dequeueReusableCell(withReuseIdentifier: identifier, for: indexPath)
            let imgView = UIImageView.init(frame: CGRect.init(x: 0, y: 0,  100, height: 100))
            if(imgAry.count > 0){
                imgView.image = imgAry[indexPath.item]
            }
            cell.addSubview(imgView)
            return cell
        }
        //选择图片
        public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]){
            let image = info["UIImagePickerControllerOriginalImage"] as! UIImage  //选择的图片
            let newImage = image.imageWithScale( 500)  //按照宽为500的宽高比给图片重新绘制新的图片
            imgAry.append(newImage)  
            colectionView.reloadData()
            picker.dismiss(animated: true, completion: nil)
        }
    
    }
    

     占用内存情况如下:

    未使用照片:25.7 MB

     

    使用未压缩的照片: 333.1MB

    使用压缩之后的照片:53.9MB

    demo源码:https://github.com/pheromone/swift-imagePicker-memory

  • 相关阅读:
    微信二维码 场景二维码 用于推送事件,关注等 注册用户 ,经过测试
    简单的 Helper 封装 -- CookieHelper
    简单的 Helper 封装 -- SecurityHelper 安全助手:封装加密算法(MD5、SHA、HMAC、DES、RSA)
    Java反射机制
    Windows Azure Web Site (13) Azure Web Site备份
    Windows Azure Virtual Machine (1) IaaS用户手册
    Windows Azure Web Site (1) 用户手册
    Windows Azure Web Site (12) Azure Web Site配置文件
    Windows Azure Web Site (11) 使用源代码管理器管理Azure Web Site
    Windows Azure Web Site (10) Web Site测试环境
  • 原文地址:https://www.cnblogs.com/shaoting/p/6557932.html
Copyright © 2011-2022 走看看