更快的 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 转换 的相关文章

  • 是否有针对不同屏幕尺寸的单独故事板?

    基本上我已经完成了一个应用程序 我唯一的问题是 ATM 机应用程序在设计时只考虑了 4 英寸显示屏 当在 3 5 英寸模拟器上运行时 应用程序会丢失 0 5 英寸 显然 那么我的问题是 如何在 Xcode 5 中为不同的屏幕尺寸设置不同的故
  • 我如何从子视图导航到 mainviewcontroller

    我刚刚开始使用 swift 我创建了一个子视图 上面有一个按钮 我想使用该按钮将我带到我的主视图控制器 我对不同的按钮使用了相同的功能 但是在同一文件中具有一个功能允许该按钮工作 代码如下 var playAgainButton UIBut
  • 使用 iOS 8 自定义键盘发送图像?

    我一直在为 iOS 8 开发自定义键盘 但在尝试使用键盘发送图像时偶然发现了一个问题 我做了一些研究 似乎没有一种简单的方法可以做到这一点UITextDocumentProxy因为只有NSStrings被允许 我是否忽略了使用自定义键盘发送
  • 将永久字符添加到 UITextField

    有没有办法将字母永久添加到 UITextField 中 用户无法删除它 我想添加一个字符 用户无法删除它 但他们仍然可以在之后添加字母 Cheers 附注这是适用于 iOS 的 A UITextField有一个名为 应该更改范围内的字符 的
  • 从 UIImagePickerController 相机视图推送 viewController

    我正在开发一款消息应用程序 类似于 WhatsApp 用户可以互相发送文本和图像消息 当用户想要发送图像时 他可以从相机胶卷中选择一张图像 也可以用相机拍摄一张图像 这就是我介绍的方式UIImagePickerController对于这两种
  • 将 UUID 存储为 base64 字符串

    我一直在尝试使用 UUID 作为数据库键 我希望占用尽可能少的字节数 同时仍然保持 UUID 表示形式的可读性 我认为我已经使用 base64 将其减少到 22 个字节 并删除了一些尾随的 这些 对于我的目的来说似乎没有必要存储 这种方法有
  • 如何替换已弃用的方法dispatch_get_current_queue()? [复制]

    这个问题在这里已经有答案了 我正在 iOS 5 中使用 xmppframework 开发一个聊天应用程序 它工作得很好 但我将 Xcode 更新到 4 5 1 将 iOS 5 更新到 iOS 6 将 Mac OS 更新到 10 7 5 但由
  • 确定 SceneKit 中 SKVideoNode 的视频大小/长宽比

    如何从 AVPlayer 获取视频的视频大小来设置节点的几何大小 例如 我有一个具有宽度和高度的 SCNPlane let planeGeo SCNPlane width 5 height 5 所以现在我实例化我的视频播放器 let vid
  • 如何在 Firebase 控制台中使用 Apple 新的 APN .p8 证书

    随着最近 Apple 开发者帐户的升级 我面临着一个困难 在尝试创建推送通知证书时 它为我提供了 p8 证书 而不是可以导出到 p12 的 APNs 证书 Firebase 控制台仅接受 p12 证书 那么我如何从这些新的 p8 证书中获取
  • 在没有预览窗口的情况下使用 AVCaptureVideoDataOutputSampleBufferDelegate

    我正在开发一个基于 Swift 的 macOS 应用程序 我需要捕获视频输入 但不将其显示在屏幕上 而不是显示视频 我想将缓冲的数据发送到其他地方进行处理 并最终显示它在 a 中的一个物体上SceneKit scene 我有一个Camera
  • 在 WKWebView 中禁用放大手势

    我正在寻找一种方法来禁用 WKWebView 的 iOS 实现上的 捏合缩放 放大手势 OS X 有一个 magnification BOOL 属性 但在 iOS 上似乎不可用 WKWebView h if TARGET OS IPHONE
  • 在横向中自动调整 UITableCells 内容的大小

    在 UITableView 中 我通过 UILabels 将内容添加到单元格中 定义最佳尺寸 与单元格宽度允许的一样大 我注意到只有tableView contentSize width是可靠的 因为cell contentView bou
  • UIScrollView setZoomScale 将应用的旋转设置回零

    我已经从事地图替换工作很长一段时间了 整个事情的工作原理是UIScrollView由一个支持CATiledLayer 为了旋转我的地图 我旋转图层本身 使用CATransform3DMakeRotation 到目前为止效果很好 但如果我打电
  • 是否可以使用 Firebase 安排推送通知? [复制]

    这个问题在这里已经有答案了 我已经阅读了我能找到的所有文档 但仍然不知道这是否可行 如果我是用户 我可以安排特定时间的推送通知吗 Example 1 我是用户并打开应用程序 2 我允许通知并转到 pickerView 或其他任何内容 并设置
  • 如何使用AudioKit保存音频文件?

    我有音频文件 我给它做了一些效果 let pitchshifter AKPitchShifter self audioPlayer pitchshifter shift 10 AudioKit output pitchshifter 如果我
  • 将 SSLSetEnabledCiphers 与 AFNetworking 结合使用来禁用弱密码

    我正在尝试禁用一些密码 弱 例如单个 DES 单个 DES 40 位等 我尝试过使用这段代码在 Cocoa 中使用 CFSocket CFStream 时如何设置 SSL 密码 https stackoverflow com questio
  • Apple Watch 预构建操作可更改故事板 customModule 引用

    我目前有一个项目 其中包含同一应用程序的 3 个不同版本 不同的品牌等 该项目运行得很好 从那时起 我添加了 3 个新的 Apple Watch 目标 每个应用程序 版本 1 个 其中 2 个引用 主 Apple Watch 目标中的文件
  • 哪些 Flutter 插件或功能可以利用外部 iOS/Android 显示器来显示与主显示器不同的内容

    我正在构建一个跨平台应用程序 需要在外部显示器上显示不同的视图 通常通过连接到 LCD 投影仪的 HDMI 适配器电缆连接 Flutter 是否能够在内置的外部显示器上显示不同的屏幕 在现有的 Flutter 插件中还是使用现有的 Flut
  • 在 iOS 7 Safari 中,如何区分通过边缘滑动与后退/前进按钮的 popstate 事件?

    在 iOS 7 Safari 中 现在有两种后退 前进导航方式 使用底部的传统后退 前进按钮箭头或从屏幕边缘滑动 我正在使用动画在 ajax 应用程序中的页面之间进行转换 但如果用户通过边缘滑动进行导航 我不想触发该转换 因为这本身就是一个
  • UIView晃动动画

    我试图在按下按钮时使 UIView 摇动 我正在调整我找到的代码http www cimgf com 2008 02 27 core animation tutorial window shake effect http www cimgf

随机推荐

  • 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对象字