【问题标题】:Swift encoding/decoding images for JSON用于 JSON 的 Swift 编码/解码图像
【发布时间】:2015-05-03 05:11:24
【问题描述】:

我对 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。一样的。

【问题讨论】:

    标签: ios json swift decode encode


    【解决方案1】:

    这些方法为您返回 nil 的原因可能是您的 base64string 是 URL 和文件名安全变体,这意味着字符 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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 是的,decodedData 为 nil。基本上,我通过 JSON 将这个值放入 mysql 数据库:let data = UIImageJPEGRepresentation(imageView.image, 50) let encodedImage = data.base64EncodedStringWithOptions(.allZeros)
      • 你试过打印base64String还是imageString?
      • 您可能没有正确编码您的图像,您可以尝试使用此在线转换将您的字符串转换为图像:askapache.com/online-tools/base64-image-converter
      • 我是这样编码的:let data = UIImageJPEGRepresentation(imageView.image, 50) let encodedImage = data.base64EncodedStringWithOptions(.allZeros)
      【解决方案3】:

      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
      • hmmm...我不确定,但据我记得我放弃了该方法。如果你愿意,请告诉我你的代码,也许我可以提供帮助
      【解决方案4】:

      对图像进行编码:

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

      解码图像:

      let decodedImage = UIImage(data: data)
      

      【讨论】:

        猜你喜欢
        • 2016-08-18
        • 2018-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多