Swift 4 Binary Approachเพื่อบีบอัดภาพ
ฉันเชื่อว่ามันค่อนข้างช้าที่จะตอบคำถามนี้ แต่นี่คือคำตอบของฉันสำหรับคำถามที่ได้รับการปรับให้เหมาะสมฉันใช้การค้นหาแบบไบนารีเพื่อค้นหาค่าที่เหมาะสมที่สุด ตัวอย่างเช่นพูดโดยวิธีการลบปกติเพื่อให้ถึง 62% จะต้องใช้ความพยายามในการบีบอัด 38 ครั้งวิธีการ * ค้นหาแบบไบนารี ** จะเข้าถึงโซลูชันที่ต้องการในบันทึกสูงสุด (100) = ประมาณ 7 ครั้ง
อย่างไรก็ตามขอแจ้งให้คุณทราบด้วยว่าUIImageJPEGRepresentationฟังก์ชันดังกล่าวไม่ทำงานเป็นเชิงเส้นโดยเฉพาะเมื่อตัวเลขใกล้ถึง 1 นี่คือการจับหน้าจอที่เราจะเห็นว่าภาพหยุดบีบอัดหลังจากค่า float เท่ากับ> 0.995 พฤติกรรมค่อนข้างคาดเดาไม่ได้ดังนั้นจึงควรมีเดลต้าบัฟเฟอร์ที่จัดการกับกรณีดังกล่าวได้ดีกว่า

นี่คือรหัสสำหรับมัน
extension UIImage {
func resizeToApprox(sizeInMB: Double, deltaInMB: Double = 0.2) -> Data {
let allowedSizeInBytes = Int(sizeInMB * 1024 * 1024)
let deltaInBytes = Int(deltaInMB * 1024 * 1024)
let fullResImage = UIImageJPEGRepresentation(self, 1.0)
if (fullResImage?.count)! < Int(deltaInBytes + allowedSizeInBytes) {
return fullResImage!
}
var i = 0
var left:CGFloat = 0.0, right: CGFloat = 1.0
var mid = (left + right) / 2.0
var newResImage = UIImageJPEGRepresentation(self, mid)
while (true) {
i += 1
if (i > 13) {
print("Compression ran too many times ")
break
}
print("mid = \(mid)")
if ((newResImage?.count)! < (allowedSizeInBytes - deltaInBytes)) {
left = mid
} else if ((newResImage?.count)! > (allowedSizeInBytes + deltaInBytes)) {
right = mid
} else {
print("loop ran \(i) times")
return newResImage!
}
mid = (left + right) / 2.0
newResImage = UIImageJPEGRepresentation(self, mid)
}
return UIImageJPEGRepresentation(self, 0.5)!
}
}