博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS图片压缩上传
阅读量:7115 次
发布时间:2019-06-28

本文共 3308 字,大约阅读时间需要 11 分钟。

需求

很多时候我们上传图片经常遇到一些问题,要不就是图片质量变差,要不就是图片太大等等问题。这里,我找到了一个算是目前比较符合需求的解决方案。在原有基础上增加了动态压缩系数,改写成Swift版本。

实现思路

先调整分辨率,分辨率可以自己设定一个值,大于的就缩小到这分辨率,小余的就保持原本分辨率。然后再根据图片最终大小来设置压缩比,比如传入maxSize = 30KB,最终计算大概这个大小的压缩比。基本上最终出来的图片数据根据当前分辨率能保持差不多的大小同时不至于太模糊,跟微信,微博最终效果应该是差不多的,代码仍然有待优化!

实现代码

// MARK: - 降低质量    func resetSizeOfImageData(source_image: UIImage, maxSize: Int) -> NSData {        //先调整分辨率        var newSize = CGSizeMake(source_image.size.width, source_image.size.height)                let tempHeight = newSize.height / 1024        let tempWidth  = newSize.width / 1024                if tempWidth > 1.0 && tempWidth > tempHeight {            newSize = CGSizeMake(source_image.size.width / tempWidth, source_image.size.height / tempWidth)        }        else if tempHeight > 1.0 && tempWidth < tempHeight {            newSize = CGSizeMake(source_image.size.width / tempHeight, source_image.size.height / tempHeight)        }                UIGraphicsBeginImageContext(newSize)        source_image.drawAsPatternInRect(CGRectMake(0,0,newSize.width,newSize.height))        let newImage = UIGraphicsGetImageFromCurrentImageContext()        UIGraphicsEndImageContext()                //先判断当前质量是否满足要求,不满足再进行压缩        var finallImageData = UIImageJPEGRepresentation(newImage,1.0)        let sizeOrigin      = Int64((finallImageData?.length)!)        let sizeOriginKB    = Int(sizeOrigin / 1024)        if sizeOriginKB <= maxSize {            return finallImageData!        }                //保存压缩系数        let compressionQualityArr = NSMutableArray()        let avg = CGFloat(1.0/250)        var value = avg                for var i = 250; i>=1; i-- {            value = CGFloat(i)*avg            compressionQualityArr.addObject(value)        }                //调整大小        //说明:压缩系数数组compressionQualityArr是从大到小存储。        //思路:折半计算,如果中间压缩系数仍然降不到目标值maxSize,则从后半部分开始寻找压缩系数;反之从前半部分寻找压缩系数        finallImageData = UIImageJPEGRepresentation(newImage, CGFloat(compressionQualityArr[125] as! NSNumber))        if Int(Int64((UIImageJPEGRepresentation(newImage, CGFloat(compressionQualityArr[125] as! NSNumber))?.length)!)/1024) > maxSize {            //从后半部分开始            for idx in 126..<250 {                let value = compressionQualityArr[idx]                let sizeOrigin   = Int64((finallImageData?.length)!)                let sizeOriginKB = Int(sizeOrigin / 1024)                print("当前降到的质量:\(sizeOriginKB)")                if sizeOriginKB > maxSize {                    print("\(idx)----\(value)")                    finallImageData = UIImageJPEGRepresentation(newImage, CGFloat(value as! NSNumber))                } else {                    break                }            }        } else {            //从前半部分开始            for idx in 0..<125 {                let value = compressionQualityArr[idx]                let sizeOrigin   = Int64((finallImageData?.length)!)                let sizeOriginKB = Int(sizeOrigin / 1024)                print("当前降到的质量:\(sizeOriginKB)")                if sizeOriginKB > maxSize {                    print("\(idx)----\(value)")                    finallImageData = UIImageJPEGRepresentation(newImage, CGFloat(value as! NSNumber))                } else {                    break                }            }        }        return finallImageData!    }

再一次感谢您花费时间阅读这篇文章!

微博:

博客:

转载地址:http://mbzel.baihongyu.com/

你可能感兴趣的文章
Jmeter 使用断言
查看>>
iframe截取网站部分内容实现思路及代码
查看>>
Ubuntu下搭建Eclipse开发环境
查看>>
12.03个人博客
查看>>
数据库修改字节数注意的问题
查看>>
[BZOJ2120]:数颜色(分块?)
查看>>
CentOS 7 使用经验(更新中)
查看>>
如何在java中导入jar包
查看>>
什么是TLS?
查看>>
win10 mstsc 远程,登录失败,账号限制
查看>>
多人开发Xcode工程冲突,打不开解决办法
查看>>
在杨氏矩阵中查找一个数字是否存在
查看>>
修改BASH的配色
查看>>
分享 MSN 2011 去广告+最小托盘 方法
查看>>
服务器运维管理
查看>>
1.2 运行您的应用
查看>>
系统开发总结教训2
查看>>
android 项目学习随笔六(网络缓存)
查看>>
Sharepoint用户权限迁移
查看>>
栈ADT
查看>>