更快的 UIImage - Base64 转换

2023-11-29

我正在做的工作必须在之间进行编码和解码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 的两个观察结果:

  1. 如果您要将图像存储在数据库中,只需存储NSDataSQLite 数据库作为 blob 就可以了。这不仅消除了“我该怎么办\r and \n字符”,但它完全消除了 Base64 编码/解码过程。它还使您在数据库中存储的内容减少了 25%。效率更高。

  2. 即便如此,众所周知,SQLite 在数据库中存储大型对象时效率很低。如果您想要获得最佳性能,请将图像存储在文件系统中,并且仅将相对路径引用存储在数据库中。我的经验法则是,如果我处理缩略图,SQLite blob 就可以,但对于更大的东西,请使用文件系统。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更快的 UIImage - Base64 转换 的相关文章

  • sizeToFit 运行异常

    我有一段代码 每次发生后端数据库更改时都会执行 本质上我在父视图中有一个标签 标签由许多状态消息之一更新 每个状态消息位于不同的行上 并以换行符 n 结尾 每条状态消息只能在一行上 并且不能过多 我遇到的问题是 当视图首次重新加载时 一切正
  • 从 iOS 设备向 Google App Engine 进行身份验证

    我正在开发一个 iPhone 应用程序 它使用 Google 应用程序引擎来托管后端 我需要通过 Google 进行身份验证 但我似乎无法找到从我的应用程序中执行此操作的方法 看来我要做一个UIWebView让用户登录到我从 Google
  • 如何使用群组在 iPhone 和 Apple Watch 之间共享数据?

    我是 Watchkit 开发新手 无法找到在 iPhone 和 iWatch 之间共享数据的解决方案 请帮助我 我希望使用组来共享数据 我们可以使用组在 iPhone 和 iWatch 之间传递数据 基本上iWatch不能做任何处理 我们需
  • UILongPressGestureRecognizer 不起作用,但将其替换为 UITapGestureRecognizer 效果很好。为什么?

    我有一个UIImageView with a UILongPressGestureRecognizer无论我如何配置手势识别器 似乎都不会检测到长按手势 但是 如果我把它换成UITapGestureRecognizer that工作得很好
  • iOS - 在 UITabBar 上方获取所需的阴影

    我试图让我的标签栏阴影看起来像这张图片中看到的那样 这样做的最佳方法是什么 我正在使用 Objective C Thanks 您可以使用以下代码为任何 UI 对象提供阴影 tabBar layer shadowOffset CGSize w
  • UIAlertAction 处理程序在延迟后运行

    我正在尝试将 UIAlertViews 更改为 UIAlertControllers 我为此设置了这个操作 UIAlertAction undoStopAction UIAlertAction actionWithTitle Undo St
  • 为什么我无法更改 UIBarButtonItem 的标题?

    我想改变UIBarButtonItem s title 但这段代码不起作用 void viewDidLoad self smay void smay AppDelegate apd AppDelegate UIApplication sha
  • UINavigationBar 滑开而不是留在原处

    我创建了演示项目来展示问题 我们在 UINavigationController 中有两个视图控制器 MainViewController这是根 class MainViewController UIViewController lazy
  • 使用基于 Cookie 的身份验证的 Capacitor iOS

    我正在使用 Capacitor v3 NextJS 静态导出和 Django 后端基于生产网站构建 iOS 应用程序 当前的后端身份验证方案通过 cookie 使用 Django 会话 并通过 cookie 设置 CSRF 令牌 应用程序可
  • 重新组织链式可观察量

    我有一大块链接的 Rx 可观察量 当通过选择表视图行时会触发这些可观察量table rx modelSelected 我希望能够打破这个逻辑 因为我目前必须在flatMapLatest 因为这是流程的 第一步 感觉不对 我必须在后续执行更多
  • UIView 周围的虚线边框

    如何在周围添加虚线边框UIView 像这样的东西 如果您喜欢子层 还有另一种方法 在您的自定义视图的 init 中 输入以下内容 border 是 ivar border CAShapeLayer layer border strokeCo
  • 如何在 iOS 应用程序中检测所有可用的 Wifi 网络并连接到其中之一

    在我的 iOS 应用程序中 我想检测所有可用的 wifi 网络 然后从列表中选择一个网络并连接到它 目标是不打开应用程序内置的设置来连接 Wi Fi 而是在我的应用程序中完成这一切 首先 这可能吗 如果可能的话 请指出要使用哪些框架和方法
  • 在后台继续下载

    我正在创建一个应用程序 其中我从服务器下载一些数据 在后台运行时 我希望连接继续运行 以便可以下载数据 我知道有方法应用程序委托 void applicationDidEnterBackground UIApplication applic
  • iOS Twitter NSURLErrorDomain 代码=-1012

    我正在尝试通过在我的应用程序中注册 Twitter 来获取用户的联系方式 我发现this https github com malcommac DMTwitterOAuthgithub上的项目看起来非常好 我只遇到一个问题 如果我使用来自
  • 如何在多个视图中显示相同的导航栏?

    我可以为一个视图重现以下导航栏 但是 一旦我单击按钮后移至下一个视图 我就会丢失最右边的两个图标 搜索 个人资料 据我所知 从故事板设置导航项目通常是按视图进行的 我可以为每个视图复制这些项目 但我想知道是否有更好的方法来完成一次 是否有教
  • dyld:无法加载插入的库,但可以在模拟器和另一部 iPhone 上使用

    所以我在过去的几个小时里在我的应用程序上编码 在某个时候我决定在我的 iPhone 8 13 3 1 上启动我的应用程序而不是使用模拟器 13 3 它立即崩溃并出现以下错误 dyld warning could not load inser
  • 如何将NSTextView的格式化内容转换为字符串

    我需要将 NSTextView 的内容从 Mac 应用程序传输到 iOS 应用程序 我使用 XML 作为传输文件格式 所以我需要将 NSTextView 的内容 文本 字体 颜色等 保存为字符串 有什么办法可以做到这一点吗 一种方法是存档
  • 共享扩展程序未出现在能够在 iPhone 上共享照片的应用程序列表中

    我正在尝试创建一个共享应用程序扩展 并按照以下来源的教程进行操作 http www technetexperts com mobile share extension in ios application overview with exa
  • iOS 11 特定设置部分的 URL 方案停止工作

    我的应用程序使用 URL 方案将用户直接带到 设置 常规 关于 部分 以下 URL 在 10 3 x 中工作正常 应用程序首选项 根 常规 路径 关于 然而 这个 URL 方案在 iOS 11 GM 版本中不再有效 它仅启动 设置 应用程序
  • Swift:UICollectionViewCell didSelectItemAtIndexPath 更改背景颜色

    我可以轻松更改单元格的背景颜色CellForItemAtIndexPath method func collectionView collectionView UICollectionView cellForItemAtIndexPath

随机推荐

  • std::wifstream::getline 对我的 wchar_t 数组做了什么? getline 返回后它被视为字节数组

    我想从文件中读取 Unicode 文本行 UTF 16 LE 换行符分隔 我正在使用 Visual Studio 2012 并针对 32 位控制台应用程序 我无法在 WinAPI 中找到 ReadLine 函数 因此我求助于 Google
  • 如何在 Eclipse 中获取类型(接口/类/枚举)中的方法计数?

    我想知道一个接口声明了多少个方法或一个类 枚举实现了多少个方法 如何在 Eclipse 中得到它 像这样的插件metrics可以给你 The 日食指标插件 另一个 也提供了类似的指标 每个类的加权方法
  • WPF 网格分割器

    我在使用 WPF GridSplitter 时遇到奇怪的行为 我将适当的 Horizo ntalAlignment 属性设置为拉伸 当我调整它们的大小时 GridSplitter 会跳来跳去 有时会回到原来的位置 或者只是在拖动它们时跳来跳
  • 如何在 Magento 中获取某个类别(包括其子类别)中的所有产品?

    我正在寻找一种方法来检索某个类别 包括其子类别 中的所有产品 并向我返回一个产品集合 我知道我可以迭代类别以获取产品的 id 并将它们加载到视图中 但我希望获得产品集合 因为它目前在大多数类别 视图中完成 有任何想法吗 我通过在产品集合模型
  • 如何分离数组中的两个值并使它们成为自己的值

    我希望我的问题不会令人困惑 但我有一个 js 数组 0 Glass 1 LDPE 2 LDPE PP 3 PP 正如你所看到的 数字 2 有两个值 我希望它们是它自己的值 基本上看起来像 0 Glass 1 LDPE 2 LDPE 3 PP
  • 找不到模块工作区/server.js

    我正在尝试使用 fast ai 中的示例和我开发的模型来启动 gcloud 应用程序引擎https github com imiled google app engine并按照 fastai 网页中的说明进行操作https course f
  • 通过迭代字典定义新变量的有效方法(Julia)

    考虑一本字典d在 Julia 中 它包含一千个键 每个键都是一个符号 每个值都是一个数组 我可以访问与符号关联的值 S1并将其分配给变量k1 via k1 d S1 现在假设我想定义新变量k2 k3 k4 k10对特殊键重复相同的过程 S1
  • 使用递归恢复字符串时如何删除点?

    我需要逆转Hello 使用递归使得最终结果不具有 我目前的方法是 public void foo Scanner scan new Scanner system in char c scan nextChar if c foo System
  • 如何导入现有的数据工厂ARM模板?

    我去了一个现有的数据工厂 并选择export template 然后 我手动创建了一个新的数据工厂 现在我尝试将现有的数据工厂导入到这个新的数据工厂 方法是转到新的数据工厂 然后选择import template 然而 这会引导我们进入一个
  • 如何在不使用“占位符” while 条件的情况下安全地循环,直到没有更多事情可做?

    为了调用我的 Web API 方法 直到没有更多数据返回 由于客户端 Windows CE 手持设备 的 98 磅弱角色 我分批获取它 以保持每个结果集较小 我正在使用这段代码 while moreRecordsExist redempti
  • 在CKFinder中自定义baseUrl和baseDir

    我们在许多 CMS 应用程序中使用 CKEditor 和 CKFinder for Coldfusion 这些应用程序指向我们服务器上的不同站点 因此我们希望 CKFinder 设置将文件上传到每个应用程序的特定目录 但我们希望服务器上的
  • 如何从数学角度看待高阶函数和IO动作?

    我试图从第一原理来理解函数式编程 但我却陷入了纯函数世界和具有状态和副作用的不纯现实世界之间的界面 从数学的角度来看 什么是返回函数的函数 什么是返回 IO 操作的函数 如 Haskell 的 IO 类型 详细说明 根据我的理解 纯函数是从
  • 关于mvc:intercepter,如何设置排除路径

    众所周知 我们可以这样配置拦截器
  • 更改android复选框的大小

    在我的 Android 应用程序中 我需要更改 Android 复选框的大小 我搜索并了解到它不能通过简单地更改属性来完成 我找到了这个链接但无法真正弄清楚到底需要做什么 找不到此链接 android sdk windows 1 0 r2
  • 使用主动/被动冗余模型的应用程序应如何使用 Kubernetes 进行容器化?

    我有一个在虚拟机上运行的分布式应用程序 其中有一个以主动 被动模式运行的服务 主用虚拟机通过公网IP提供服务 如果主动虚拟机发生故障 公共 IP 将移至被动虚拟机 被动虚拟机将变为主动虚拟机并开始提供服务 这种模式如何适合 kubernet
  • 在网页中显示 PDF

    我正在使用 Spring MVC 我想将 PDF 文件从本地显示到网页 我不知道我应该对我的控制器做什么来做到这一点 我看到一些类似的问题 其答案返回ResponseEntity
  • R:对 2 个数据帧的行进行 t 测试

    我有两个数据框 我想对行进行独立的 2 组 t 检验 即t test y1 y2 where y1是 dataframe1 中的一行并且y2与数据帧2中的匹配行 实现这一目标的最佳方法是什么 编辑 我刚刚找到了格式 dataframe1 i
  • 如何隐藏iOS状态下录音时的红条?

    我使用AVAudioRecorder来录制语音 我发现有时当我分配它并开始录音时 状态栏下会出现一个红色条 就像您在后台调用时的红色条 如何隐藏它 你不能那样做 每个应用程序 包括内置的语音备忘录应用程序 在使用麦克风时都会有该栏
  • 通过 JAXB 解组读取自定义 XML 处理指令

    通过 JAXB 解组时有没有办法读取自定义 xml 处理指令 例子
  • 更快的 UIImage - Base64 转换

    我正在做的工作必须在之间进行编码和解码UIImage和 Base 64 字符串 这对于较小的图像非常有效 向前和向后转换只需不到 1 秒 但当我将其应用于较大的图像时 需要很长时间 几乎一分钟 有没有其他方法来编码和解码UIImage对象字