【问题标题】:Decode a base64 data to image将 base64 数据解码为图像
【发布时间】:2016-12-05 04:50:52
【问题描述】:

此代码不再适用于 Swift 3。

imageData = NSData(base64EncodedString: mediaFile, options: NSDataBase64DecodingOptions.fromRaw(0)!)

这个也是。

imageData = NSData(base64EncodedString: mediaFile, options: .allZeros)

【问题讨论】:

  • Swift 3 你应该使用 Data 而不是 NSData。
  • if let imageData = Data(base64Encoded: base64EncodedImageString, options: .ignoreUnknownCharacters), let image = UIImage(data: imageData) { print(image.size) }
  • mediaFile 是一个由base64编码字符组成的字符串

标签: uiimage base64 swift3 nsdata xcode8


【解决方案1】:

不要使用NSData,而是直接使用Swift 3 native Data

if let decodedData = Data(base64Encoded: mediaFile, options: .ignoreUnknownCharacters) {
    let image = UIImage(data: decodedData)
}

【讨论】:

  • 什么是媒体文件?字符串或数据
【解决方案2】:

Swift 4.1

有时字符串有前缀data:image/png;base64 会使base64Encoded 返回nil,对于这种情况:

extension String {
    func base64ToImage() -> UIImage? {
        if let url = URL(string: self),let data = try? Data(contentsOf: url),let image = UIImage(data: data) {
            return image
        }
        return nil
    }
}

演示代码:

let results = text.matches(for: "data:image\\/([a-zA-Z]*);base64,([^\\\"]*)")
for imageString in results {
    autoreleasepool {
        let image = imageString.base64ToImage()
    }
}

extension String {
    func matches(for regex: String) -> [String] {
        do {
            let regex = try NSRegularExpression(pattern: regex)
            let results = regex.matches(in: self, range:  NSRange(self.startIndex..., in: self))
            return results.map {
                //self.substring(with: Range($0.range, in: self)!)
                String(self[Range($0.range, in: self)!])
            }
        } catch let error {
            print("invalid regex: \(error.localizedDescription)")
            return []
        }
    }
}

PS:有关数据 uri 的更多信息:

https://en.wikipedia.org/wiki/Data_URI_scheme

https://github.com/nodes-vapor/data-uri

【讨论】:

  • 不错的答案!您能否更新最新 swift 的代码?收到以下警告:'substring(with:)' 已弃用:请使用字符串切片下标。和“未使用的结果”。两者都是:self.substring(with: Range($0.range, in: self)!)
【解决方案3】:

斯威夫特

Swift 3.0 不建议再使用 NS 了,NSData 也一样

 if let decodedImageData = Data(base64Encoded: mediaFile, options: .ignoreUnknownCharacters) {
        let image = UIImage(data: decodedImageData)
    }

在 Objective-C 中

NSURL *url = [NSURL URLWithString:base64String];    
NSData *decodedImageData = [NSData dataWithContentsOfURL:url];
UIImage *image = [UIImage imageWithData:decodedImageData];

【讨论】:

    【解决方案4】:

    我将其实现为 UIImage 扩展

    extension UIImage {
    
        /* 
         @brief decode image base64
         */
        static func decodeBase64(toImage strEncodeData: String!) -> UIImage {
    
            if let decData = Data(base64Encoded: strEncodeData, options: .ignoreUnknownCharacters), strEncodeData.characters.count > 0 {
                return UIImage(data: decData)!
            }
            return UIImage()
        }
    }
    

    【讨论】:

      【解决方案5】:

      你可以这样写

      let data = NSData(base64Encoded: mediaFile, options: NSData.Base64DecodingOptions(rawValue: 0))
      

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 2012-10-05
        • 2021-11-20
        • 1970-01-01
        • 1970-01-01
        • 2011-01-31
        • 2018-09-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多