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

  • 相关阅读:
    线程池优化之充分利用线程池资源
    Spring异步调用原理及SpringAop拦截器链原理
    使用pdfBox实现pdf转图片,解决中文方块乱码等问题
    Spring BPP中优雅的创建动态代理Bean
    转载:ThreadPoolExecutor 源码阅读
    Springboot定时任务原理及如何动态创建定时任务
    SpringSecurity整合JWT
    SpringMvc接口中转设计(策略+模板方法)
    HashMap 源码阅读
    支付宝敏感信息解密
  • 原文地址:https://www.cnblogs.com/shaoting/p/6557932.html
Copyright © 2011-2022 走看看