更快的UIImage - Base64转换

时间:2016-08-26 18:57:16

标签: ios swift encoding base64 decode

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

2 个答案:

答案 0 :(得分:5)

使用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的{​​{1}},然后将其删除。如果您不使用该选项,则不会删除\n\r

\n

关于SQLite的两个观察结果:

  1. 如果您要将图像存储在数据库中,只需将extension UIImage { var base64EncodedString: String? { if let data = UIImagePNGRepresentation(self) { return data.base64EncodedStringWithOptions([]) } return nil } } SQLite数据库存储为blob即可。这不仅消除了“我如何处理NSData\r字符”,而且完全消除了base64编码/解码过程。它还使您在数据库中存储的内容减小了25%。它效率更高。

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

答案 1 :(得分:0)

你不需要' map'代码。以下代码:

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选项,则

无效。查看description

  

IgnoreUnknownCharacters

     

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