[英]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.