Swift对JSON进行图像编码/解码

9
我有点新手,需要一些关于编码图像的帮助,将其放入JSON中,在检索后将其解码回NSData并在UIImage视图控制器中重新创建图像。我找到了这篇文章Convert Image to Base64 string in iOS + Swift,但是我卡在了这个部分:let decodedData = NSData(base64EncodedString: base64String, options: NSDataBase64DecodingOptions.fromRaw(0)!),因为fromRaw方法不再可用。
先前编辑: 我正在使用swiftyJson解析数组,我是这样获取图像数据的:
var base64String = arrayJson[0]["photo"].stringValue
var imageString = base64String as NSString

而后我尝试这样对其进行解码:
let decodedData = NSData(base64EncodedString: imageString, options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters)

我也尝试使用rawValue而不是IgnoreUnknownCharacters。两者都返回nil。还尝试使用base64String而不是imageString,结果仍然一样。

4个回答

11

你可以尝试以下方法,将一个base64编码的字符串转换成UIImage对象:

 //base64 string to NSData
 let decodedData = NSData(base64EncodedString: base64String, options: NSDataBase64DecodingOptions(rawValue: 0))

//NSData to UIImage
var decodedIamge = UIImage(data: decodedData!)

NSDataBase64EncodingOptions.fromRaw(0)! 现在已更改为 NSDataBase64DecodingOptions(rawValue: 0)

了解更多编码/解码详情,请访问此文章:在iOS Swift中UIImage与Base64字符串之间的转换


是的,decodedData 是空的。基本上,我通过 JSON 将这个值放入了 mysql 数据库:let data = UIImageJPEGRepresentation(imageView.image, 50) let encodedImage = data.base64EncodedStringWithOptions(.allZeros) - Adrian Stoicescu
你尝试过打印base64String或imageString吗? - ztan
是的.....imageString 的开头是这样的:/9j/4AAQSkZJRgABAQEASABIAAD/4QCMRXhpZgAATU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIAAIdpAAQAAAABAAAAWgAAAAAAAAAAAAAAAQAAAAAAAAABAAOgAQA - Adrian Stoicescu
你可能没有正确编码图像,可以尝试使用此在线转换器将字符串转换为图像:http://www.askapache.com/online-tools/base64-image-converter/ - ztan
我这样进行编码:let data = UIImageJPEGRepresentation(imageView.image, 50) let encodedImage = data.base64EncodedStringWithOptions(.allZeros) - Adrian Stoicescu
你可以打印出你的encodedImage(一个字符串),并在解码过程中比较它是否与'base64String'匹配。此外,你可以在http://www.askapache.com/online-tools/base64-image-converter/中对图像进行编码,并使用转换器中的字符串,确保从原始输出中去除'data:image/png;base64'。你可以尝试使用我gists文件中的base 64字符串:https://gist.githubusercontent.com/ziyang0621/60c18dcb7c5bfa1eb762/raw/90c46541deab749f45d60110bfc17b9cd3b55575/gistfile1.txt - ztan

3

对图像进行编码:

let image = UIImage(...)
let quality = 1.0
let data: NSData = UIImageJPEGRepresentation(image, quality)!

解码图像的方法如下:
let decodedImage = UIImage(data: data)

1
这些方法返回nil的原因可能是你的base64字符串是URL和文件名安全变体,意味着字符62 (0x3E)被替换为“-”(减号),字符63 (0x3F)被替换为“_”(下划线),如base64字母表所示。
尝试在字符串中用“/”替换字符“_”,用“+”替换字符“-”。
你可以使用以下代码:
base64string = base64string.stringByReplacingOccurrencesOfString("-", withString: "+", options: NSStringCompareOptions.LiteralSearch, range: nil)
base64string = base64string.stringByReplacingOccurrencesOfString( "_" , withString: "/", options: NSStringCompareOptions.LiteralSearch, range: nil)

同时要注意字符串的正确长度,它必须是4的倍数- 参考这个答案padded string


0

NSData类参考:https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSData_Class/index.html#//apple_ref/c/tdef/NSDataBase64DecodingOptions

NSDataBase64DecodingOptions:

struct NSDataBase64DecodingOptions : RawOptionSetType {
    init(_ rawValue: UInt)
    init(rawValue rawValue: UInt)
    static var IgnoreUnknownCharacters: NSDataBase64DecodingOptions { get }
}

你尝试过以下方法之一吗:
  • let decodedData = NSData(base64EncodedString: base64String, options: NSDataBase64DecodingOptions(rawValue: 0)!)
  • let decodedData = NSData(base64EncodedString: base64String, options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters)

你最终解决了这个问题吗?我也在面对同样的事情。@AdrianStoicescu - MizAkita
嗯...我不太确定,但据我记得,我放弃了这个方法。如果你愿意,给我看看你的代码,也许我可以帮忙。 - Adrian Stoicescu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接