用于JSON的Swift编码/解码图像

时间:2015-03-02 18:20:57

标签: ios json swift decode encode

我对swift很新,我需要一些帮助来编码一些图像,将它放在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。两者都归零。还尝试使用base64String而不是imageString。同样的事情。

4 个答案:

答案 0 :(得分:9)

您可以执行以下操作,将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)

有关更多编码/解码详情,请访问以下帖子:Convert between UIImage and Base64 string

答案 1 :(得分:3)

编码图像:

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

解码图像:

let decodedImage = UIImage(data: data)

答案 2 :(得分:1)

这些方法为您返回nil的原因可能是您的base64string是一个URL和Filename安全变体,意味着字符62(0x3E)被替换为“ - ”(减号)并且字符63(0x3F)被替换使用“_”(下划线),如此处所述base64 alphabet

尝试将字符_替换为/,将字符-替换为字符串中的+

您可以使用以下代码:

base64string = base64string.stringByReplacingOccurrencesOfString("-", withString: "+", options: NSStringCompareOptions.LiteralSearch, range: nil)
base64string = base64string.stringByReplacingOccurrencesOfString( "_" , withString: "/", options: NSStringCompareOptions.LiteralSearch, range: nil)

还要注意字符串的正确长度。它必须是4的倍数 - 看一下这个答案padded string

答案 3 :(得分: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)