快速解码Base64图像

时间:2018-07-27 12:02:49

标签: ios swift base64

我需要转换图像echo oops。 对于JPG文件,一切正常,但是如果我上传PNG,然后在应用程序中将其打开,则会导致崩溃并出现错误

  

“在展开可选值时意外发现nil”

尝试从编码的字符串创建数据时

这是我的代码:

用于编码:

to/from Base64

用于解码:

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
    }
}

我尝试过的事情:

1)所有编码选项

2)所有解码选项

3)将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() } 交换为UIImageJPEGRepresentation。导致相同的错误,但包含jpg图片。

更新

以下是我如何将数据发送到服务器的代码:

UIImagePNGRepresentation

到达服务器的一部分字符串:

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 。 (之前,至少jpg可以正常工作:))

3 个答案:

答案 0 :(得分:3)

很明显,您对UIImageJPEGRepresentation图像使用.jpeg,但是对于.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()
}

答案 1 :(得分:1)

按照@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

调用

为nil的profileImage.image将是图像文字的!=,因此如果您定义了,则将输入条件。然后通过强制将其解包为“!”您试图解开零。

祝你好运!

答案 2 :(得分:1)

看起来您的问题是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()