swift简单处理调用高清大图导致内存暴涨的情况
开发中,通常需要用到使用选取多张图片的功能,但是高清大图很吃内存,我想到的处理方案就是拿到高清大图的时候,重新绘制一张小的图片使用.至于清晰度尚可,至少我是分辨不出多大区别.
基本思路就是先固定宽,然后根据宽高比重新绘制一张新图片使用,大致代码如下:
为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
swift简单处理调用高清大图导致内存暴涨的情况的更多相关文章
- IOS 多个UIImageView 加载高清大图时内存管理
IOS 多个UIImageView 加载高清大图时内存管理 时间:2014-08-27 10:47 浏览:59人 当我们在某一个View多个UIImageView,且UIImageView都显示的是 ...
- WPF 异步加载高清大图
不管什么东西,但凡太大了,总是让人又爱又恨啊!(很有道理的样子,大家鼓掌└( ̄  ̄└)(┘ ̄  ̄)┘) 猿:老板,现在这社会啊,真是浮躁啊,之前还是什么1080P,然后就到了2K,现在又到了4K……他 ...
- 利用python爬虫关键词批量下载高清大图
前言 在上一篇写文章没高质量配图?python爬虫绕过限制一键搜索下载图虫创意图片!中,我们在未登录的情况下实现了图虫创意无水印高清小图的批量下载.虽然小图能够在一些移动端可能展示的还行,但是放到pc ...
- python妹子图爬虫5千张高清大图突破防盗链福利5千张福利高清大图
meizitu-spider python通用爬虫-绕过防盗链爬取妹子图 这是一只小巧方便,强大的爬虫,由python编写 所需的库有 requests BeautifulSoup os lxml 伪 ...
- [自带避雷针]DropShadowEffect导致内存暴涨
原文:[自带避雷针]DropShadowEffect导致内存暴涨 [自带避雷针]DropShadowEffect导致内存暴涨 周银辉 从学习WPF开始, 就知道"位图效果"不是什 ...
- Python ThreadPoolExecutor 线程池导致内存暴涨
背景 在有200W的任务需要取抓取的时候,目前采用的是线程池去抓取,最终导致内存暴涨. 原因 Threadpoolexcutor默认使用的是无界队列,如果消费任务的速度低于生产任务,那么会把生产任务无 ...
- 关于SDWebImage加载高清图片导致app崩溃的问题
链接是对于SDWebImage的使用方法 http://www.cnblogs.com/JimmyBright/p/4457258.html 使用SDWebImage加载高清图片的时候,往往会报内存溢 ...
- MySQL information_schema表查询导致内存暴涨
case:下面的一条sql语句,导致mysql实例内存暴涨: select * from tables where table_name not in(select table_name from p ...
- FineUI(专业版)高清大图赏析!(第二波)
FineUI(专业版)是由三生石上全新打造的基于 jQuery 的专业 ASP.NET 控件库,计划在七月下旬正式发布. 选择FineUI(专业版)的四大理由:1. 简单:专业版和开源版兼容(v4.x ...
随机推荐
- 函数使用十一:FTP
网上很多FTP说明的文档,也很详细,写这玩意是备份一下: 注:有的系统需要配置FTP地址和端口,有的好像没有... SM30->SAPFTP_SERVERS_V,默认端口21. 在做之前可以做个 ...
- 在ASP.NET MVC 框架中调用 html文件及解析get请求中的参数值
在ASP.NET MVC 框架中调用 html文件: public ActionResult Index() { using (StreamReader sr = new StreamReader(P ...
- Nodejs--util模块
util.inspect util.inspect是一个将任意对象转换 为字符串的方法,通常用于调试和错误输出. 它至少接受一个参数 object,即要转换的对象. util.inspect(obje ...
- Elastic-Job 介绍
Elastic-Job是一个分布式调度解决方案,它解决了什么问题呢? 如果你需要定时对数据进行处理,但由于数据量实在太大了,一台机器处理不过来,于是用两台机器处理,第一台处理 id 为奇数的数据,第二 ...
- CentOS 7使用yum安装SNMP教程
一.安装SMNP yum install -y net-snmp net-snmp-utils 可以理解为net-snmp是服务端,net-snmp-utils是客户端工具集:如果机器上只需要搭建服务 ...
- Linux只下载不安装软件包
有时我们并不需要安装软件而只要下载软件包. 包格式 命令 命令所属包 命令下载格式 rpm yumdownloader yum-utils yumdownloader package_name deb ...
- QPainter绘制渐进色文本
参考资料:https://blog.csdn.net/what951006/article/details/52876513 效果图: 代码: void WgtText::paintEvent(QPa ...
- 随机数类Random
我们来学习下,用来产生随机数的类Random,它也属于引用数据类型. 这个Random类,它可以产生多种数据类型的随机数,在这里我们主要介绍生成整数与小数的方式. l 方法简介 public int ...
- swiper添加了自动滚动效果,然后用手指划过页面,发现自动滚动效果不生效了
我给swiper添加了自动滚动效果,然后用手指划过页面,发现自动滚动效果不生效了,哪里出了问题呢? 添加参数 autoplayDisableOnInteraction : false,
- js地址多选实现,居住地,户口,职业,行业多选2
需求是根据点击一个按钮 实现动态添加数据,所以每个数据都有一个地址多选, 以下是效果实现及部分关键代码,相关js相关文件在 http://www.cnblogs.com/zhan1995/p/848 ...