ios - 更快的 UIImage - Base64 转换

标签 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
    }
}

最佳答案

随着 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 就可以了,但对于任何更大的东西,请使用文件系统。

关于ios - 更快的 UIImage - Base64 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39173048/

相关文章:

ios - 将segue动画更改为 "Show",但它卡在 "Modal"

ios - 什么是自动布局中的乘数和常数?

ios - 发布的应用程序中存在 iAd?

ios - 快速弹出所有 View Controller

java - C# 的 getBytes ("UTF-8") 和 Encoding.UTF8.GetBytes() 之间的区别

encoding - 在 Haxe 中使用 sys.io.File.read 读取文件时指定文件编码

ios - CollectionViewCell设置默认位置

iphone - 将 NSString 转换为特定于语言环境的 NSNumber

ios - 无法从 UITabBar 快速获取 UIImageView

java - 使用正确的编码进行内部编译?