大圖片壓縮解決方案
PS:將圖片(size)最大的(width或height)壓縮到指定尺寸沼头,用一句通俗的話說就是最大邊的尺寸(也就是長(zhǎng)圖還是寬圖)。拿到圖片之后再使用二分法將圖片(data)大小壓縮到指定大小
思路解析
1.計(jì)算原始和目標(biāo)的對(duì)應(yīng)的最大邊比例。
2.判斷圖片的width和height哪個(gè)大凡辱,找到最大的(width或height)
如果是width大就拿原始size的寬高分別比上上一步得到的tmpW比;
如果是height就拿原始size的寬高分別比上上一步得到的tmpH比;
得到新的newSize
3.拿到新的newSize后利用UIGraphics得到新的newImg
4.在利用二分法壓縮圖片(data壓縮)至目標(biāo)大小爷抓。(注意這里的大小單位是byte。如果想要Mb需要乘上1024*1024)
/// 壓縮到最大寬高 和指定大小 byte
func compressToDataWith(maxWH:CGFloat, maxSize:Int) -> UIImage{
var wh = maxWH
if maxWH <= 0{
wh = 2048
}
var newSize = self.size
let tmpH = newSize.height/wh
let tmpW = newSize.width/wh
if tmpH > 0 && tmpW > tmpH{
newSize = CGSize(width: self.size.width/tmpW, height: self.size.height/tmpW)
}else if tmpH > 1.0 && tmpW < tmpH{
newSize = CGSize(width: self.size.width/tmpH, height: self.size.height/tmpH)
}
UIGraphicsBeginImageContext(newSize)
self.draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height))
let newImg = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
if let img = newImg?.compressImageMidToImg(maxLength: maxSize){
return img
}
return self
}
二分法壓縮圖片(data)
/// 二分壓縮法圖片 img
func compressImageMidToImg(maxLength: Int) -> UIImage {
if let data = self.compressImageMid(maxLength: maxLength), let img = UIImage(data: data){
return img
}
return self
}
/// 二分壓縮法圖片 data
func compressImageMid(maxLength: Int) -> Data? {
var compression: CGFloat = 1
guard var data = self.jpegData(compressionQuality: 1) else { return nil }
KWLog("壓縮前kb: \( Double((data.count)/1024))")
if data.count < maxLength {
return data
}
print("壓縮前kb", data.count / 1024, "KB")
var max: CGFloat = 1
var min: CGFloat = 0
for _ in 0..<6 {
compression = (max + min) / 2
data = self.jpegData(compressionQuality: compression)!
if CGFloat(data.count) < CGFloat(maxLength) * 0.9 {
min = compression
} else if data.count > maxLength {
max = compression
} else {
break
}
}
if data.count < maxLength {
return data
}
return nil
}