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

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

为UIImage写一个extention,方便调用

import UIKit

extension UIImage{
    //根据传入的宽度生成一张按照宽高比压缩的新图片
    func imageWithScale(width:CGFloat) -> UIImage{
       //1.根据 宽度 计算高度
        let height = width * size.height / size.width
      //2.按照宽高比绘制一张新的图片
        let currentSize = CGSize.init(width: 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, width: 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(width: 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