Ios swift中Base64图像的解码

Ios swift中Base64图像的解码,ios,swift,base64,Ios,Swift,Base64,我需要将图像转换为Base64。 对于JPG文件,所有这些都可以正常工作,但是如果我上传PNG,然后在应用程序中打开它,就会导致崩溃,并出现错误 “在展开可选值时意外发现nil” 尝试从编码字符串创建数据时 这是我的密码: 对于编码: static func base64Convert(base64String: String?) -> UIImage { var decodedImage = #imageLiteral(resourceName: "no_prof_image"

我需要将图像
转换为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
到达服务器的字符串的一部分:

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
图像使用
uiimagejpegresentation
,但对于
.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()
}

很明显,对于
.jpeg
图像,您使用
uiimagejpegresentation
,但是对于
.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为零将!=到图像文字,因此如果您定义了,则会输入条件。然后,通过强制使用“!”将其展开,您试图展开零


祝你好运

正如@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为零将!=到图像文字,因此如果您定义了,则会输入条件。然后,通过强制使用“!”将其展开,您试图展开零


祝你好运

看起来您的问题在于PNG数据的大小,它比JPEG数据大得多。因此,您的服务器可能对图像上载有大小限制


关于编码方法,如果让pngData=UIImagePNGRepresentation(image),则将永远不会执行第二个条件。您必须选择要使用PNG或JPEG数据表示(由于大小限制,大多数情况下使用JPEG)。顺便说一句,使用可选链接会容易得多

return UIImageJPEGRepresentation(image, 1)?.base64EncodedString()
Swift 4.2 Xcode 10或更高版本

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

看起来您的问题是PNG数据的大小比JPEG数据大得多。因此,您的服务器可能对图像上载有大小限制


关于编码方法,如果让pngData=UIImagePNGRepresentation(image),则将永远不会执行第二个条件。您必须选择要使用PNG或JPEG数据表示(由于大小限制,大多数情况下使用JPEG)。顺便说一句,使用可选链接会容易得多

return UIImageJPEGRepresentation(image, 1)?.base64EncodedString()
Swift 4.2 Xcode 10或更高版本

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


我认为问题不在于转换。问题是你的图片在转换前为零。我在下面的答案中发表的评论同样适用于你的问题。如果let pngData=UIImagePNGRepresentation(image)将永远不会执行第二个条件。您必须选择使用PNG或JPEG。顺便说一句,使用可选链接
返回UIImageJPEGRepresentation(图像,1)?.base64EncodedString()
@LeoDabus是的,谢谢。我等着它变魔术,却忘了我已经试过了。@Kvazios看起来你的问题是你的PNG数据比JPEG数据大得多。所以您的服务器可能对图像上载有大小限制。@LeoDabus回答您是对的:)我认为问题不在于转换。问题是你的图片在转换前为零。我在下面的答案中发表的评论同样适用于你的问题。如果let pngData=UIImagePNGRepresentation(image)将永远不会执行第二个条件。您必须选择使用PNG或JPEG。顺便说一句,使用可选链接
返回UIImageJPEGRepresentation(图像,1)?.base64EncodedString()
@LeoDabus是的,谢谢。我等着它变魔术,却忘了我已经试过了。@Kvazios看起来你的问题是你的PNG数据比JPEG数据大得多。因此,您的服务器可能对您的图像上载有大小限制。@LeoDabus回答您是对的:)@Kvazios您确定您尝试了此处建议的变体吗?上面的代码尝试使用UIImageJPEGRepresentation,如果失败,则尝试使用PNG。它应该会起作用。请您尝试一下,并显示您得到的错误是什么?@ekscrypto在展开可选值时意外发现nil
dataDecoded
为零,则显然您仍在使用强制展开,第二个条件
否则,如果让pngData=UIImagePNGRepresentation(image)
将永远不会执行。您必须选择使用PNG或JPEG。顺便说一句,使用可选链接
返回UIImageJPEGRepresentation(图像,1)?.base64EncodedString()
@LeoDabus
UIImagePngResentation
UIImageJPEGresentation
都会返回可选的
数据?
-或者是图像的有效
数据
表示,或者