Car*_*s.V 1 base64 encoding decode ios swift
我正在做的工作,我必须编码和解码UIImage和Base 64字符串).这适用于较小的图像,向前和向后转换只需不到1秒,但当我将其应用于较大的图像时,需要很长时间,几乎一分钟.
是否还有其他方法可以将UIImage对象编码和解码为字符串以将其保存在SQLite数据库中?或者,如果没有其他方法可以改善这一点,我还能做些什么来完成这项工作,我可以摆脱这个问题吗?
这些是我用来完成工作的扩展方法:
extension String {
var toUIImage: UIImage? {
var img = self
img = String(img.characters.map({ $0 == "\r" ? " " : $0 }))
img = String(img.characters.map({ $0 == "\n" ? " " : $0 }))
img = String(img.characters.map({ $0 == "\r\n" ? " " : $0 }))
let dataDecoded:NSData? = NSData(base64EncodedString: img, options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters)
return UIImage(data: dataDecoded!)
}
}
extension UIImage {
var toString: String {
let data = UIImagePNGRepresentation(self)
let encoded = data!.base64EncodedDataWithOptions(.Encoding64CharacterLineLength)
var cadena = String(data: encoded, encoding: NSUTF8StringEncoding)!
cadena = String(cadena.characters.map({ $0 == "\r" ? " " : $0 }))
cadena = String(cadena.characters.map({ $0 == "\n" ? " " : $0 }))
cadena = String(cadena.characters.map({ $0 == "\r\n" ? " " : $0 }))
return cadena
}
}
Run Code Online (Sandbox Code Playgroud)
有了String扩展,你可以使用.IgnoreUnknownCharacters,你不必做任何更换\r,并\n在所有:
extension String {
var imageFromBase64EncodedString: UIImage? {
if let data = NSData(base64EncodedString: self, options: .IgnoreUnknownCharacters) {
return UIImage(data: data)
}
return nil
}
}
Run Code Online (Sandbox Code Playgroud)
同样,在您的UIImage扩展程序中,请不要使用.Encoding64CharacterLineLength,它会引入\r和\n,然后才会删除它们.如果您不使用该选项,则没有\r并\n删除:
extension UIImage {
var base64EncodedString: String? {
if let data = UIImagePNGRepresentation(self) {
return data.base64EncodedStringWithOptions([])
}
return nil
}
}
Run Code Online (Sandbox Code Playgroud)
关于SQLite的两个观察:
如果您要将图像存储在数据库中,只需将NSDataSQLite数据库存储为blob并完成它.这不仅消除了"我该怎么办\r和\n字符",而且完全消除了base64编码/解码过程.它还使您在数据库中存储的内容减小了25%.效率更高.
即使这样,SQLite在将大型对象存储在数据库中也是非常低效的.如果要获得最佳性能,请将映像存储在文件系统中,并仅在数据库中存储相对路径引用.我的经验法则是,如果我处理缩略图图像,SQLite blob很好,但对于任何更大的图像,请使用文件系统.
| 归档时间: |
|
| 查看次数: |
1281 次 |
| 最近记录: |