我正在做的工作必须在之间进行编码和解码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
}
}
随着String
扩展,你可以使用.IgnoreUnknownCharacters
并且您无需进行任何替换\r
and \n
at all:
extension String {
var imageFromBase64EncodedString: UIImage? {
if let data = NSData(base64EncodedString: self, options: .IgnoreUnknownCharacters) {
return UIImage(data: data)
}
return nil
}
}
同样,在你的UIImage
扩展,不要使用.Encoding64CharacterLineLength
,其中介绍了\r
and \n
,然后将它们删除。如果您不使用该选项,则没有\r
and \n
去除:
extension UIImage {
var base64EncodedString: String? {
if let data = UIImagePNGRepresentation(self) {
return data.base64EncodedStringWithOptions([])
}
return nil
}
}
关于 SQLite 的两个观察结果:
如果您要将图像存储在数据库中,只需存储NSData
SQLite 数据库作为 blob 就可以了。这不仅消除了“我该怎么办\r
and \n
字符”,但它完全消除了 Base64 编码/解码过程。它还使您在数据库中存储的内容减少了 25%。效率更高。
即便如此,众所周知,SQLite 在数据库中存储大型对象时效率很低。如果您想要获得最佳性能,请将图像存储在文件系统中,并且仅将相对路径引用存储在数据库中。我的经验法则是,如果我处理缩略图,SQLite blob 就可以,但对于更大的东西,请使用文件系统。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)