Decode a base64 data to image

前端 未结 5 1796
广开言路
广开言路 2020-12-28 19:57

This code doesn\'t working with Swift 3 anymore.

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


        
相关标签:
5条回答
  • 2020-12-28 20:03

    Instead of using NSData use directly Swift 3 native Data.

    if let decodedData = Data(base64Encoded: mediaFile, options: .ignoreUnknownCharacters) {
        let image = UIImage(data: decodedData)
    }
    
    0 讨论(0)
  • 2020-12-28 20:17

    You can write like this way

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

    Hope it will help you

    0 讨论(0)
  • 2020-12-28 20:19

    Swift

    Swift 3.0 does not recommend to use NS any more and the same case with NSData as well

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

    In Objective-C

    NSURL *url = [NSURL URLWithString:base64String];    
    NSData *decodedImageData = [NSData dataWithContentsOfURL:url];
    UIImage *image = [UIImage imageWithData:decodedImageData];
    
    0 讨论(0)
  • 2020-12-28 20:22

    Swift 4.1:

    Sometimes string has prefix data:image/png;base64 will make base64Encoded return nil, for this situation:

    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
        }
    }
    

    Demo code:

    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 []
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-28 20:23

    I implemented this as UIImage extension

    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()
        }
    }
    
    0 讨论(0)
提交回复
热议问题