我需要转换图像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可以正常工作:))
答案 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()