Decode a base64 data to image
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 []
}
}
}
PS: For more about data uri:
https://en.wikipedia.org/wiki/Data_URI_scheme
https://github.com/nodes-vapor/data-uri
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];
Instead of using NSData
use directly Swift 3 native Data
.
if let decodedData = Data(base64Encoded: mediaFile, options: .ignoreUnknownCharacters) {
let image = UIImage(data: decodedData)
}