簡體   English   中英

快速解碼Base64圖像

[英]Decoding Base64 image in swift

我需要將圖像to/from Base64相互轉換。 JPG文件一切正常,但是如果我上傳PNG,然后在應用程序中將其打開,則會導致崩潰並顯示錯誤

“在展開可選值時意外找到nil”

嘗試從編碼的字符串創建數據時

這是我的代碼:

對於編碼:

static  func base64Convert(base64String: String?) -> UIImage {
    var decodedImage = #imageLiteral(resourceName: "no_prof_image")
    if ((base64String?.isEmpty)! || (base64String?.contains("null"))!) {
        return decodedImage
    }else {
        if  let imageBase64String = base64String,
            let dataDecoded = Data(base64Encoded: imageBase64String, options: .ignoreUnknownCharacters) {
            decodedImage = UIImage(data: dataDecoded) ?? #imageLiteral(resourceName: "no_prof_image")
        }
        return decodedImage
    }
}

對於解碼:

static func makeProfileBase64FromImage(image: UIImage) -> String? {
    var imageData : Data?
    if let jpegData = UIImageJPEGRepresentation(image, 1.0) {
        imageData = jpegData
    } else if let pngData = UIImagePNGRepresentation(image) {
        imageData = pngData
    }
    return imageData?.base64EncodedString()
}

我試過的

1)所有編碼選項

2)所有解碼選項

3)將UIImageJPEGRepresentation交換為UIImagePNGRepresentation 導致相同的錯誤,但使用jpg圖片。

更新

這是我如何將數據發送到服務器的代碼:

var imageToSend : String = "null"

        if profileImage.image != #imageLiteral(resourceName: "no_prof_image"),
            let validImage = profileImage.image,
            let imageBase64 = AppUtils.makeProfileBase64FromImage(image: validImage) {
            imageToSend = imageBase64
        }

let parameters : Parameters = [
    "image": imageToSend
]

Alamofire.request(AppUtils.API_URL + "update_profile.php", method: .post, parameters: parameters)
    .validate().responseData() {response in

    switch response.result {
        case .success:
            //...Some stuff
            break
        case .failure:
            //...Some stuff
            break
    }
}

到達服務器的部分字符串:

/9j/4AAQSkZJRgABAQAASABIAAD/4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQAAAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAABkKADAAQAAAABAAABkAAAAAD/7QA4UGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAAA4QklNBCUAAAAAABDUHYzZjwCyBOmACZjs+EJ+/8AAEQgBkAGQAwERAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//E

問題中的更新代碼

目前,該代碼還沒有強制展開。 但是現在我總是得到標准的#imageLiteral(resourceName: "no_prof_image") (之前,至少jpg可以正常工作:))

很明顯,對於.jpeg圖像使用UIImageJPEGRepresentation ,但對於.png圖像,應使用UIImagePNGRepresentation

另外,請勿使用強制展開。

static func makeBase64FromImage(image: UIImage) -> String? {
    var imageData : Data?
    if let jpegData = UIImageJPEGRepresentation(image, 1.0) {
        imageData = jpegData
    } else if let pngData = UIImagePNGRepresentation(image) {
        imageData = pngData
    }
    return imageData?.base64EncodedString()
}

正如@mag_zbc建議的那樣,從以下開始:

static func makeBase64FromImage(image: UIImage) -> String? {
    var imageData : Data?
    if let jpegData = UIImageJPEGRepresentation(image, 1.0) {
        imageData = jpegData
    } else if let pngData = UIImagePNGRepresentation(image) {
        imageData = pngData
    }
    return imageData?.base64EncodedString()
}

然后,將此代碼更新為:

var imageToSend : String = "null"
if profileImage.image != #imageLiteral(resourceName: "no_prof_image"),
   let validImage = profileImage.image,
   let imageBase64 = AppUtils.makeBase64FromImage(image: validImage) {
       imageToSend = imageBase64
}
let parameters : Parameters = [
    "image": imageToSend
]
...

通常,您要避免使用“!” 除非您可以100%確認在任何情況下始終定義該值,否則您可以在任何位置。 在這種情況下,我認為問題是您的代碼被profileImage.image == nil調用

profileImage.image為nil會等於圖像文字,!=,因此如果您定義了,則將輸入條件。 然后通過強制將其解包為“!” 您嘗試解開零。

祝好運!

看來您的問題是PNG數據大小比JPEG數據大得多。 因此,您的服務器可能對圖片上傳有大小限制。

關於您的編碼方法第二個條件else if let pngData = UIImagePNGRepresentation(image)將永遠不會執行。 您必須選擇要使用PNG或JPEG數據表示的格式(由於大小限制,大多數情況下是JPEG)。 順便說一句,使用可選鏈接會容易得多。

return UIImageJPEGRepresentation(image, 1)?.base64EncodedString()

Swift 4.2 Xcode 10或更高版本

return image.jpegData(compressionQuality: 1)?.base64EncodedString()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM