• 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

  • 相关阅读:
    Linux下修改Mysql最大并发连接数
    linux ORACLE备份还原(EXPIMP)
    免安装Oracle客户端使用PL/SQL连接Oracle
    连接ORACLE客户端工具navicat111.12 for oracle
    安装Oracle 11.2.0.3 Client Win 32-bit
    sharepoint 2013创建网站集,域帐户无法访问,只有administrator可以访问
    VS2013 ERROR SCRIPT5009: “WebForm_AutoFocus”未定义
    TimeUnit类 java.util.concurrent.TimeUnit
    Redis: 分布式锁的正确实现方式(转)
    java synchronized实现可见性对比volatile
  • 原文地址:https://www.cnblogs.com/shaoting/p/6557932.html
Copyright © 2020-2023  润新知