在Swift中啄骇,可以使用Core Graphics和Image I/O框架來實(shí)現(xiàn)圖片的壓縮。以下是將圖片壓縮到指定大小以內(nèi)的示例代碼:
func compressImage(image: UIImage, maxSize: Int) -> Data? {
? ? var compression: CGFloat = 1.0? ? let maxCompression: CGFloat = 0.1? ? let targetSize = CGSize(width: 1024, height: 1024) //指定尺寸? ? let scale = UIScreen.main.scale //根據(jù)設(shè)備屏幕縮放比例調(diào)整尺寸? ?
? ? var imageData = image.jpegData(compressionQuality: compression)
? ? var imageSize = imageData?.count ?? 0? ? var sizeExceeded = imageSize > maxSize
? ? while sizeExceeded && compression > maxCompression {
? ? ? ? compression -= 0.1? ? ? ? imageData = image.jpegData(compressionQuality: compression)
? ? ? ? imageSize = imageData?.count ?? 0? ? ? ? sizeExceeded = imageSize > maxSize
? ? }
? ? if let imageSource = CGImageSourceCreateWithData(imageData as CFData, nil) {
? ? ? ? let options: [CFString: Any] = [
? ? ? ? ? ? kCGImageSourceThumbnailMaxPixelSize: max(targetSize.width, targetSize.height) * scale,
? ? ? ? ? ? kCGImageSourceCreateThumbnailFromImageAlways: true,
? ? ? ? ? ? kCGImageSourceCreateThumbnailWithTransform: true? ? ? ? ]
? ? ? ? if let scaledImage = CGImageSourceCreateThumbnailAtIndex(imageSource, 0, options as CFDictionary) {
? ? ? ? ? ? if let scaledImageData = UIImage(cgImage: scaledImage).jpegData(compressionQuality: compression) {
? ? ? ? ? ? ? ? imageData = scaledImageData
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? return imageData
}
該函數(shù)的參數(shù)image是要壓縮的圖片柏卤,maxSize是指定的最大尺寸,單位為字節(jié)匀油。該函數(shù)會先嘗試將圖片質(zhì)量壓縮到指定大小以內(nèi)缘缚,如果仍然超過指定大小,則會將圖片尺寸縮小到指定大小以內(nèi)敌蚜。
在上面的代碼中桥滨,首先定義了壓縮質(zhì)量的初始值compression為1.0,最小壓縮質(zhì)量maxCompression為0.1弛车。然后通過循環(huán)將壓縮質(zhì)量逐漸降低该园,直到圖片大小不超過指定大小或者壓縮質(zhì)量降到最小值為止。
接著使用Core Graphics框架中的CGImageSourceCreateWithData函數(shù)創(chuàng)建了一個(gè)圖片源imageSource帅韧,然后通過指定縮略圖的最大像素大小和其他選項(xiàng)里初,使用CGImageSourceCreateThumbnailAtIndex函數(shù)創(chuàng)建了一個(gè)縮略圖。最后再將縮略圖轉(zhuǎn)換為JPEG格式的二進(jìn)制數(shù)據(jù)返回即可忽舟。
需要注意的是双妨,上述代碼中指定了縮略圖的尺寸為1024x1024淮阐,可以根據(jù)實(shí)際需求進(jìn)行調(diào)整。同時(shí)刁品,該函數(shù)返回的是JPEG格式的二進(jìn)制數(shù)據(jù)泣特,可以根據(jù)需要進(jìn)行存儲或展示。