本文共 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/