2015-07-04 41 views
1

在我的應用程序中,我必須以Base64字符串的形式將UIImage上載到服務器,條件是字符串不得超過54999個字符。縮小UIImage以適應最大Base64長度

我目前使用一般的作品,但它有時甚至是一個因素需要大量的時間,內存和上傳的圖片Base64編碼字符串,通常是54999.非常關閉的長度碼10

var imageData = UIImagePNGRepresentation(image) 
var base64String = imageData.base64EncodedStringWithOptions(.allZeros) 

var scaledImage: UIImage = image 
var newSize: CGSize = image.size 

while ((base64String as NSString).length > 54999) 
{ 
    newSize.width *= 0.5 
    newSize.height *= 0.5 

    scaledImage = image.imageScaledToFitSize(newSize) 

    imageData = UIImagePNGRepresentation(scaledImage) 
    base64String = imageData.base64EncodedStringWithOptions(.allZeros) 
} 

// proceed to upload Base64 string... 

在開始的時候我以爲我會這樣下面的方式,但是這顯然是因爲有文件的大小和它的Base64編碼長度之間不存在線性相關性並沒有在所有的工作:

let maxLength: NSInteger = 54999 

if ((base64String as NSString).length > maxLength) 
{ 
    let downScaleFactor: CGFloat = CGFloat(maxLength)/CGFloat((base64String as NSString).length)     

    var size: CGSize = image.size 
    size.width *= downScaleFactor 
    size.height *= downScaleFactor 

    scaledImage = image.imageScaledToFitSize(size) 

    imageData = UIImagePNGRepresentation(scaledImage) 
    base64String = imageData.base64EncodedStringWithOptions(.allZeros) 
} 

必須有一個更好的辦法做這個。

回答

1

這是一個棘手的問題。 base64編碼會造成圖像大小的可預測的下降(3個字節變爲4,或者大小增加33%)

由於字節大小的減小取決於您是否可以確定來自PNG或JPEG壓縮的結果大小在被壓縮的圖像上。 (一個純色的矩形很好壓縮,一個使用純色的卡通壓縮得很好,一個連續色調的照片有很多細節也不會壓縮。)

使用JPEG圖像可能會有更好的運氣,因爲您可以調整這些壓縮級別,JPEG提供更高的壓縮比。

我會建議與最低畫質可以容忍試驗(使用質量設置。5,看圖像,並調整向上/向下從那裏,直到你看起來「足夠好」的圖像。)

然後使用該壓縮。您可以跳過base64編碼直到結束,因爲您可以簡單地將您的非base64字節大小乘以4/3以獲得基本64編碼後的大小。

我建議將圖像縮小1/sqrt(2)(〜0.7)而不是0.5。減少50%將導致圖像大小的較大跳躍。