给定一个 CIImage,将图像数据写入磁盘的最快方法是什么?

2023-11-26

我正在使用 PhotoKit 并实现了用户可以应用于其照片库中的照片的过滤器。我目前正在获取图像,应用过滤器,将编辑后的版本返回为CIImage,然后我将CIImage into NSData using UIImageJPEGRepresentation所以我可以将其写到磁盘上。虽然这效果很好,但当用户尝试编辑非常大(如 30 MB)的照片时,可能需要 30 秒以上的时间才能完成,其中 98% 的时间花在UIImageJPEGRepresentation(从 Instruments 获得的统计数据)。

如果可能的话,我正在寻找一种更有效的方法来将编辑后的照片保存到磁盘而不影响质量。

我明白UIImagePNGRepresentation可能会提高质量,但这比 JPEG 表示还要慢。

这就是我目前正在默认优先级线程上所做的事情(qos_class_utility):

func jpegRepresentationOfImage(image: CIImage) -> NSData {
    let eaglContext = EAGLContext(API: .OpenGLES2)
    let ciContext = CIContext(EAGLContext: eaglContext)

    let outputImageRef = ciContext.createCGImage(image, fromRect: image.extent())
    let uiImage = UIImage(CGImage: outputImageRef, scale: 1.0, orientation: UIImageOrientation.Up)

    return UIImageJPEGRepresentation(uiImage, 0.9) //this takes upwards of 20-30 seconds with large photos!
}

//writing out to disk:
var error: NSError?
let success = jpegData.writeToURL(contentEditingOutput.renderedContentURL, options: NSDataWritingOptions.AtomicWrite, error: &error)

尝试使用 CIContext 方法写JPEG表示(iOS 10 可用)如下,以避免 UIImage 并使写入速度更快。

extension CIImage {

    @objc func saveJPEG(_ name:String, inDirectoryURL:URL? = nil, quality:CGFloat = 1.0) -> String? {
        
        var destinationURL = inDirectoryURL
        
        if destinationURL == nil {
            destinationURL = try? FileManager.default.url(for:.documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
        }
        
        if var destinationURL = destinationURL {
            
            destinationURL = destinationURL.appendingPathComponent(name)
            
            if let colorSpace = CGColorSpace(name: CGColorSpace.sRGB) {
                
                do {

                    let context = CIContext()

                    try context.writeJPEGRepresentation(of: self, to: destinationURL, colorSpace: colorSpace, options: [kCGImageDestinationLossyCompressionQuality as CIImageRepresentationOption : quality])
                    
                    return destinationURL.path
                    
                } catch {
                    return nil
                }
            }
        }
        
        return nil
    }
}

@objc 关键字使您能够在 Objective-C 中调用该方法,如下所示:

NSString* path = [image saveJPEG:@"image.jpg" inDirectoryURL:url quality:1.0];

对于 PNG 有类似的方法写PNG表示对于 iOS 11:

   if #available(iOS 11.0, *) {

        if let colorSpace = CGColorSpace(name: CGColorSpace.sRGB) {
                
            do {
                let format = CIFormat.RGBA8
                    
                try context.writePNGRepresentation(of: self, to: destinationURL, format: format, colorSpace: colorSpace)
                    
                return destinationURL.path
                    
            } catch {
                return nil
            }   
        }
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

给定一个 CIImage,将图像数据写入磁盘的最快方法是什么? 的相关文章

  • showViewController:sender 的相反编程方式是什么:

    我正在编写一个仅限 iOS 8 的应用程序 并且我正在使用新的自适应演示文稿 结合使用 显示 和 显示详细信息 segue 以及showViewController sender and showDetailViewController s
  • 在 Swift 中向 UIButton 添加字符串属性

    如何将字符串属性与UIButton在斯威夫特 我不希望该字符串显示为按钮文本 而只是将其作为标识符或键分配给按钮 这是我到目前为止所拥有的 func createAnswerButtons var index Int for index 0
  • 将 NSDecimalNumber 转换为 NSString

    我正在从如下所示的对象中检索密钥 po obj TypeID 3 TypeName Asset 键值的检索方式如下 NSString typeId NSString obj objectForKey TypeID typeId 不是 NSS
  • Swift 完成处理程序语法

    此代码用于回答此处的问题 如何在 Swift 中发出 HTTP 请求 https stackoverflow com questions 24016142 how to make an http request in swift let u
  • 动态增加UITableViewCell中UILabel的高度?

    我有一个 UITableView 其中显示一个自定义单元格 我的单元格有两个标签和一个视图 如下图所示 我已经像这样给出了左视图的约束 项目标签限制 中心视图约束 右视图的约束 I am using a bean class to stor
  • AVPlayerLayer获取图像到UIImageView缓冲区

    我尝试 playerLayer renderInContext UIGraphicsGetCurrentContext 它将显示黑色背景 所以我得到当前播放器项目作为连续的重击图像 它看起来不像视频播放 只是静态图像连续流动 那么还有其他选
  • 进入/退出编辑模式时重绘 UITableViewCell

    我有一个表格视图 其中根据表格是否正在编辑 单元格的构建方式有所不同 具体来说 处于编辑模式时选择样式为无 非编辑模式时选择样式为蓝色 当我从一个单元转换到另一个单元时 我注意到某些单元格没有更新 快速的日志记录告诉我 即使单元格的外观发生
  • 恢复从未付款过的用户的应用内购买

    我正在尝试在我的应用程序中测试应用程序内购买 当我与购买了应用程序内购买的测试用户恢复应用程序内购买时 一切正常 但是当我尝试与用户恢复应用内购买时didn t在我期望框架调用以下方法之前进行应用内购买 paymentQueue resto
  • CFBundle可执行文件丢失或无效

    尝试在 iOS 模拟器中运行我的项目时 我收到启动代码错误 0 检查 CoreSimulator log 中的控制台日志 我发现了 app 可执行文件 其 Info plist 中缺少或无效 CFBundleExecutable 我不知道如
  • set-key-partition-list codesign 后仍提示密钥访问

    我正在导入一个PEM使用以下命令包含我的代码签名身份的公钥和私钥的文件 security import PEM FILE k Library Keychains login keychain T usr bin codesign T usr
  • PhoneGap/Cordova:如何使用cookies(iOS)?

    我有一个适用于 iOS 的 PhoneGap Corodova 项目 在 iOS 模拟器上构建时 我使用了 Jquery Cookies 它们很好 但是 既然我的设备上有该应用程序用于测试 它们就不再工作了 我猜这只是 iOS 不支持的东西
  • CloudKit 通过 cron 作业发送推送通知?

    我正在创建一个大学餐饮菜单应用程序 在其中我需要根据每日菜单发送推送通知 最初 我计划通过 Heroku 将用户数据存储在数据库中 并使用 cron 作业将数据库中的数据与每日菜单进行比较 并向用户发送适当的通知 然而 在 Cloudkit
  • 显示不带字母的数字键盘

    iOS 默认数字键盘中是否有隐藏数字下方字母的选项 对于某些电话语言 键盘显示时不带字母 抱歉 你所要求的是不可能的 这取决于键盘语言 只有用户可以更改键盘语言 我希望这能帮到您
  • 如何在iPhone应用程序中的类结构中实现主键和外键表数据[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何连接sqlite数据库中的两个表数据 if sqlite3 open dbPath UTF8String database SQL
  • BUG - 在 IOS 中没有选择标签的完成按钮

    我正在使用最新的离子并有一个简单的选择标签
  • 对于 Swift 中的计算器

    只是要警告你 我是 Swift 的新手 我仍在适应它的工作原理 我一直在尝试在课堂上完成这个计算器项目 问题是 我需要练习简化代码 现在 当按下数字按钮时 我将其保存在这样的数组中 IBAction func buttonPressed s
  • Swift - 本地通知不会被触发

    我正在 Swift 3 中编码 我只是想发送通知now没有任何延迟或间隔 然而 通知永远不会被触发 这是我的代码 视图控制器代码 import UserNotifications class HomeViewController UIVie
  • 删除 UICollectionView 中的最后一个单元格会导致崩溃

    您好 我正在使用自定义 UICollectionView https github com SureCase WaterfallCollectionView https github com SureCase WaterfallCollec
  • Swift 中的“funcobserveValueForKeyPath(keyPath:NSString,object:AnyObject,change:NSDictionary,context:Void)”问题

    我已经为 AVPlayer 添加了一个观察者 如下所示 self audioPlayer addObserver self forKeyPath currentItem status options NSKeyValueObservingO
  • 自定义字体显示在 IB 中,但不显示在模拟器中

    我已经设置了一个UITextView and a UILabel使用自定义字体 它是垂直镜像的蒙古文字体 但我还添加了英文文本 以便您可以看到效果 这些文字显示在 Interface Builder 中 但在模拟器中大部分字符都在UITex

随机推荐

  • NSURLRequest:如何处理重定向的帖子?

    我对 NSURLRequest 和伴奏 实现进行了尝试和测试 它非常适合给定 URL 的 GET 和 POST 但是 我现在想要移动 URL 的目标而不更改应用程序使用的 URL 因此我打算通过 DNS 提供商使用 Webhop 重定向 这
  • Babel.js 如何将类声明编译成 ES2015?

    我当前的任务是将 JavaScript 组件 ES5 转换为 ES6 用 Babel js 编译 在使用类和 Babel js 之前 我们进行原型设计以从其他组件获取函数 com company js ComponentA prototyp
  • libpng 1.5.10 错误:取消引用指向不完整类型的指针

    png read info png ptr info ptr png byte color type info ptr gt color type png byte bit depth info ptr gt bit depth 对于最后两
  • 在 Javascript 中反序列化 PHP 数组

    我有一个表 其中包含一系列序列化数组的行 我计划请求并将其传递给JavaScript 问题是 是否有可能unserialize使用 JavaScript 而不是 PHP 否则 我将不得不加载所有行 循环它们并反序列化它们 并将它们分配给一个
  • kubernetes - 将入口流量路由到某些路径的特定 Pod

    我有多个 Pod 可以自动扩展和缩小 我使用入口作为入口点 我需要根据某些条件 比如说路径 将外部流量路由到特定的 Pod 在发出请求时 我确信特定的 Pod 已启动 例如 假设我有域 someTest com 通常将流量路由到 pod 1
  • 如果值是由触发器生成的,如何注释 Id 列?

    我设置了 Oracle XE 10g Hibernate 3 5 JPA 2 0 有一个带有主键的简单表 由数据库触发器在插入时生成 触发器从序列中获取值 触发器 序列构造是由Oracle XE 完成的 实际的问题是 在 EntityMan
  • devtools::check() 上的包导入错误

    我有一个包 其中在描述文件中包含以下包导入 Imports lubridate assertthat R6 stringr I don t使用以下命令将它们导入到我的包的命名空间中import pkgname or importFrom p
  • 如何在不创建数组的情况下使用 NgFor 来生成矩阵 UI 模式

    我想实现 UI 矩阵模式 它应该动态生成 通过接收输入参数 它应该决定 UI 矩阵图案的尺寸 例如 9X3 元素 图案 9x3 元素 我使用 Angular2 js typescript SCSS html 模板及其外观 import Co
  • 使用 sed 或 awk 修复日期格式

    我正在尝试使用以下方法将包含表格的 HTML 转换为 csv 文件bash script 到目前为止我已经完成了以下步骤 转换为 Unix 格式 使用dos2unix 删除所有空格和制表符 使用sed s t g 删除所有空行 用sed a
  • 如何从特定矩形区域内的 pdf 文档中提取文本? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我必须从特定矩形区域内的 pdf 文档中提取文本 工作流程如下 首先将pdf转换为jpg图像 然后用户在图片顶部绘制选择矩形 然后我需要以某种方式从
  • MVP 中的模型需要上下文

    在 android 中使用 MVP 时 我需要使用模型中的活动上下文来获取所有已安装应用程序的列表 访问上下文的正确方法是什么 或者在遵循 MVP 模式的同时实现相同目的的任何替代方法是什么 以下是课程 主要活动 java public c
  • Python 函数定义中 -> 是什么意思?

    我最近在看的时候发现了一些有趣的事情Python 3 3 语法规范 funcdef def NAME parameters gt test suite Python 2 中缺少可选的 箭头 块 我在 Python 3 中找不到有关其含义的任
  • onclick按钮时如何清除编辑文本

    如何清除单击按钮时动态提供给 EditText 的数据 我该如何编写代码 我使用什么功能或方法 Try public void clear View v edittext setText Where clear被注册为布局文件中按钮的 on
  • jquery:用跨度替换输入

    我试图用包含输入值的跨度替换输入 以便能够在单击按钮时将它们切换回来 我认为这最容易分两个阶段完成 添加 span input value span 在输入前面 然后隐藏输入 唯一的问题是我在第一部分遇到了麻烦 我正在尝试类似的事情 con
  • 从视图创建表 - Oracle SQL SQL 错误:ORA-01723:不允许使用零长度列

    我需要从视图创建一个表 语句如下 CREATE TABLE NEW TABLE AS SELECT from VIEW 它给出如下错误消息 无法从视图创建表 使用 Select 语句 Error report SQL Error ORA 0
  • error_get_last() 和自定义错误处理程序

    odbc errormsg不报告错误消息odbc execute就像它应该的那样 它只是发出警告 所以我被迫编写一个 hack 来解析错误消息error get last 我在用着set error handler and error ge
  • 选项卡中的 Google 图表 - 隐藏选项卡中的图表大小和位置不正确

    我有一组两个选项卡 每个选项卡内都有一个 Google 图表 这两个图表的大小和位置应该相同 加载页面后 图表的位置就是我想要的位置 无论您最初位于哪个选项卡 然后 当您移动到另一个选项卡 最初隐藏 时 图表的位置和大小会发生变化 您可以在
  • 是否应该关闭 JPA 实体管理器?

    我有下面的方法 public Profile readUser String email EntityManager em EMF get createEntityManager return em find Profile class e
  • UIViewController 转换 - Objective-C

    I have UIViewControllersA和B 它们被分配在AppDelegate 我需要对他们应用过渡 如何在不重新分配和更换的情况下传输它们UIViews 这段代码从我的调用UIBarButtonItem in UINaviga
  • 给定一个 CIImage,将图像数据写入磁盘的最快方法是什么?

    我正在使用 PhotoKit 并实现了用户可以应用于其照片库中的照片的过滤器 我目前正在获取图像 应用过滤器 将编辑后的版本返回为CIImage 然后我将CIImage into NSData using UIImageJPEGRepres