更快的UIImage – Base64转换

我正在做的工作,我必须在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\n

 extension String { var imageFromBase64EncodedString: UIImage? { if let data = NSData(base64EncodedString: self, options: .IgnoreUnknownCharacters) { return UIImage(data: data) } return nil } } 

同样,在你的UIImage扩展中,不要使用.Encoding64CharacterLineLength ,它会引入\r\n ,然后才删除它们。 如果您不使用该选项,则没有\r\n要删除:

 extension UIImage { var base64EncodedString: String? { if let data = UIImagePNGRepresentation(self) { return data.base64EncodedStringWithOptions([]) } return nil } } 

关于SQLite的两个观察:

  1. 如果您要将图像存储在数据库中,只需将NSData SQLite数据库存储为blob并完成它。 这不仅消除了“我怎么处理\r\n字符”,而是完全消除了base64编码/解码过程。 它还使您在数据库中存储的内容减小了25%。 效率更高。

  2. 即使这样,SQLite在将大型对象存储在数据库中也是非常低效的。 如果要获得最佳性能,请将映像存储在文件系统中,并仅在数据库中存储相对路径引用。 我的经验法则是,如果我处理缩略图图像,SQLite blob很好,但对于任何更大的图像,请使用文件系统。

您根本不需要“地图”代码。 以下代码:

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

如果将NSData(base64EncodedString:options:)IgnoreUnknownCharacters选项一起使用, IgnoreUnknownCharacters 。 检查说明 :

IgnoreUnknownCharacters

修改解码算法,使其忽略未知的非Base-64字节, 包括行结束字符