如何在 iOS 中发布 CGImageRef

2023-11-30

我正在编写这个方法来计算图像的平均 R、G、B 值。以下方法将 UIImage 作为输入并返回包含输入图像的 R、G、B 值的数组。但我有一个问题:如何/在哪里正确释放 CGImageRef?

-(NSArray *)getAverageRGBValuesFromImage:(UIImage *)image
{
    CGImageRef rawImageRef = [image CGImage];

    //This function returns the raw pixel values
    const UInt8 *rawPixelData = CFDataGetBytePtr(CGDataProviderCopyData(CGImageGetDataProvider(rawImageRef)));

    NSUInteger imageHeight = CGImageGetHeight(rawImageRef);
    NSUInteger imageWidth = CGImageGetWidth(rawImageRef);

    //Here I sort the R,G,B, values and get the average over the whole image
    int i = 0;
    unsigned int red = 0;
    unsigned int green = 0;
    unsigned int blue = 0;

    for (int column = 0; column< imageWidth; column++)
    {
        int r_temp = 0;
        int g_temp = 0;
        int b_temp = 0;

        for (int row = 0; row < imageHeight; row++) {
            i = (row * imageWidth + column)*4;
            r_temp += (unsigned int)rawPixelData[i];
            g_temp += (unsigned int)rawPixelData[i+1];
            b_temp += (unsigned int)rawPixelData[i+2];

        }

        red += r_temp;
        green += g_temp;
        blue += b_temp;

    }

    NSNumber *averageRed = [NSNumber numberWithFloat:(1.0*red)/(imageHeight*imageWidth)];
    NSNumber *averageGreen = [NSNumber numberWithFloat:(1.0*green)/(imageHeight*imageWidth)];
    NSNumber *averageBlue = [NSNumber numberWithFloat:(1.0*blue)/(imageHeight*imageWidth)];


    //Then I store the result in an array
    NSArray *result = [NSArray arrayWithObjects:averageRed,averageGreen,averageBlue, nil];


    return result;
}

我尝试了两件事: 选项1: 我保持原样,但几个周期(5+)后程序崩溃,并且出现“内存不足警告错误”

选项2: 我添加一行 CGImageRelease(rawImageRef) 在方法返回之前。现在它在第二个周期后崩溃,我收到传递给该方法的 UIImage 的 EXC_BAD_ACCESS 错误。当我尝试在 Xcode 中分析(而不是运行)时,我在这一行收到以下警告 “调用者此时不拥有的对象的引用计数的错误递减”

我应该在哪里以及如何释放 CGImageRef?

Thanks!


正如其他人所说,您的内存问题是由复制的数据引起的。但这里有另一个想法:使用 Core Graphics 的优化像素插值来计算平均值。

  1. 创建 1x1 位图上下文。
  2. 将插值质量设置为中等(见下文)。
  3. 将图像缩小到这一像素。
  4. 从上下文缓冲区读取 RGB 值。
  5. (当然,要释放上下文。)

这可能会带来更好的性能,因为核心显卡经过高度优化,甚至可能使用 GPU 进行缩减。

测试表明,中等质量似乎通过取颜色值的平均值来插值像素。这就是我们想要的。

至少值得一试。

Edit:好吧,这个想法看起来太有趣了,值得尝试一下。所以这是一个示例项目显示差异。以下测量值是使用包含的 512x512 测试图像进​​行的,但您可以根据需要更改图像。

通过迭代图像数据中的所有像素来计算平均值大约需要 12.2 毫秒。绘制到一个像素的方法需要 3 毫秒,因此速度大约快 4 倍。使用时似乎会产生相同的结果kCGInterpolationQualityMedium.

我认为巨大的性能增益是 Quartz 注意到它不必完全解压缩 JPEG 而只使用 DCT 的低频部分的结果。当组合比例低于 0.5 的 JPEG 压缩像素时,这是一个有趣的优化策略。但我只是在这里猜测。

有趣的是,当使用你的方法时,70%的时间花在CGDataProviderCopyData而像素数据遍历只占30%。这暗示 JPEG 解压缩花费了大量时间。

Pixel Iterating Screenshot Draw-To-One-Pixel Screenshot

Note: 这是迟来的跟进在上面的示例图像上。

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

如何在 iOS 中发布 CGImageRef 的相关文章

  • ios Vision VNImageRequestHandler方向问题

    我正在尝试使用相机通过相机检测脸部VNImageRequestHandler iOS 愿景 当我在横向模式下用相机指向照片时 它会检测到面部 但方向模式相反 let detectFaceRequestHandler VNImageReque
  • 所有针对 iTunes Connect 的构建,导入此构建时出错 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我将构建上传到应用程序商店 之后它在活动中显示错误 任何人都可以帮帮我 SOLVED 转到构建设置 gt 搜索 bitcode gt 转启
  • 由于 2.23 导致 iOS 应用程序被拒绝 - iOS 数据存储指南

    以下是 Apple 关于拒绝的消息 2 23 应用程序必须遵循 iOS 数据存储指南 否则将被拒绝 2 23 详情 在启动和内容下载时 您的应用程序会存储 6 5 MB 这并不意味着 遵守 iOS 数据存储指南 下一步 请验证只有用户使用您
  • 如何在 iOS 中将 Firebase 对象持久保存到磁盘?

    看起来Firebase http www firebase comiOS 实现不支持客户端模型的离线缓存 这在实践中意味着 对于需要身份验证的 Firebase 应用程序 您需要首先进行身份验证并等待 Firebase 完成登录 检查用户身
  • 如何在应用程序项目中使用 Cocoa Touch 框架

    我熟悉构建单个 iOS 应用程序 但我坚持使用 Cocoa Touch 框架向多个应用程序共享通用代码 问题 框架的头文件不可见 无法链接到消费应用程序项目 我做了什么 1 我创建了一个名为 libTestFramework 的项目 Coc
  • 如何在 Swift 中使用 CoreBluetooth 更新 BLE 设备的电池电量?

    func peripheral peripheral CBPeripheral didDiscoverCharacteristicsFor service CBService error Error for c in service cha
  • 如何使用 SwiftUI 获取多个屏幕上的键盘高度并移动按钮

    以下代码获取键盘显示时的键盘高度 并将按钮移动键盘高度 在转换源 ContentView 和转换目标 SecibdContentView 处以相同的方式执行此移动 但按钮在转换目标处不移动 如何使按钮在多个屏幕上移动相同 import Sw
  • IDFA 使用不当,您的应用不遵守 ios 中的限制广告跟踪设置

    I have checked the iTC settings I have uploaded the same app 2 days ago and it works fine but when today I uploaded the
  • 如何区分 iTunes Connect / Apple TestFlight 上的 STAGE 和 PRODUCTION 版本?

    阶段构建与阶段服务器的对话 阶段服务器与生产服务器尽可能相同 以用于测试目的 生产构建与生产服务器的通信 生产服务器存储真实的关键数据 这些构建本质上是针对同一应用程序的 但是 iTunes Connect 界面将向您显示以下内容 即构建由
  • 使用 Quartz 创建 PDF 注释 (iOS)

    有人设法使用 Quartz 在现有 PDF 中编写自定义注释吗 我已经使用 CGPDFDocumentRef 等渲染了 PDF 现在工作正常 我成功地阅读了 Annots 字典 if CGPDFDictionaryGetArray page
  • 如何解决 iOS 6 SDK 中的 hidesBottomBarWhenPushed 行为异常的问题?

    我遇到了中描述的相同问题这个 OpenRadar 问题 http www openradar me 14670329 正如那里所说 摘要 UIViewController的hidesBottomBarWhenPushed属性 对于使用 iO
  • 与新 Apple Music 应用程序中相同的动态状态栏

    是否可以动态着色statusBar这是在新的苹果音乐应用程序 Edit iOS 8 4 中的新 Apple Music 应用程序具有此功能 打开应用程序 选择并播放歌曲 状态栏为白色 向下滑动播放器控制器以查看 我的音乐 控制器 它有黑色状
  • 如何编辑应用程序包中的文件?

    在我的应用程序中 我从存储在捆绑资源中的 CSV 文件加载数据 但是 我希望能够在用户点击 更新 按钮时以编程方式更新此文件 有没有办法以编程方式更改应用程序包中的资源 这是我用来访问该文件的代码 NSString path NSBundl
  • Apple Developer 应用程序门户不再可以生成新的 Bundle Seed ID

    iOS 开发者门户中的新界面不再为您的应用程序 ID 提供 生成新的 按钮 取而代之的是 使用团队 ID 这将导致使用相同的种子 ID 任何人都知道为什么要进行更改以及您应该如何使用新的捆绑包种子 ID 随意补一些 不再可能生成新的种子 I
  • 将 Armadillo C++ 库导入 Xcode

    我是 Mac 用户 正在尝试安装和导入 C Armadillo 库 以下是我到目前为止所采取的步骤 1 我从其网站下载了犰狳库 2 我仔细阅读了下载文件中的 Readme txt 文件 解释了如何安装它 3 我使用CMake将犰狳下载文件制
  • iOS 如何触发视频退出全屏后继续播放?

    我正在构建一个在 iOS 中播放视频的网站 我有一个在 iOS 中工作的全屏按钮 但是退出全屏时视频会暂停 有谁知道一种方法可以强制视频在退出全屏时继续播放 或者如何设置一个侦听器来触发视频在退出全屏时自动播放 这是我的代码
  • 在 Swift 中以编程方式为 iOS 制作带有名字首字母的图像,例如 Gmail

    我需要在 UITableView 中显示与其姓名相对应的每个用户的个人资料图片 在下载图像之前 我需要显示一张带有他名字的第一个字母的图像 就像在 GMail 应用程序中一样 如何在 Swift for iOS 中以编程方式执行此操作 不需
  • 如何在 iOS 上固定证书的公钥

    在提高我们正在开发的 iOS 应用程序的安全性时 我们发现需要对服务器的 SSL 证书 全部或部分 进行 PIN 操作以防止中间人攻击 尽管有多种方法可以做到这一点 但当您搜索此内容时 我只找到了固定整个证书的示例 这种做法会带来一个问题
  • WKWebview 中的 iCLoud 文档选择器关闭容器视图

    我有一个 WKWebview 加载基于 Web 的 UI 我希望用户能够从其 iCloud 文档上传文件 我已授予正确的权限 并且可以浏览 iCloud 文档 但是 当我选择文件或单击取消按钮时 文档选择器视图也会关闭 WKWebview
  • 如何将自定义 C 代码放入 SwiftPM 包中?

    我正在尝试将 C 代码打包到 Swift 模块中 我们称之为CModule 一旦我将其放入项目的基本文件夹中 Swift模块 并配置了搜索路径 我可以在 Swift 文件中自动完成工作 并检测错误 警告 问题是 导入时它无法识别该模块 并且

随机推荐

  • 如何在异步任务中拥有舒适的(例如 GNU-readline 样式)输入行?

    我有一个异步程序 有两个任务 任务 1 做了一些工作 任务2提供命令行界面 CLI 它读取用户的命令并将其发送给任务1进行处理 CLI 基本上是一个循环 从连接到标准输入的异步流中读取行 它可以工作 但不是很舒服 问题是输入行不提供除 BA
  • GTSummary 中的行分组

    我正在尝试对一些行 变量 分类变量和连续变量 进行分组 以帮助提高大型数据集中的表可读性 这是虚拟数据集 library gtsummary library tidyverse library gt set seed 11012021 Cr
  • 如何使用特征对象来引用具有泛型方法的结构

    关于这个问题 将闭包存储在 HashMap 中 我了解到正确地将闭包传递给函数需要该函数是通用的 并且采用任何实现 Fn FnMut 或 FnOnce 特征的类型 在实现 C 库的一部分作为学习练习时 我需要某种类似这样的类型抽象 use
  • R 中的意外符号请参阅代码

    我试图编写一个函数来解析和合并一些数据 但是 R 抛出了意外的符号错误异常 我尝试了不同的方法来解决这个问题 仍然不起作用 请帮忙 see code aggall function df grp numcols sapply df clas
  • SqlDependency.OnChange 未在 WinForm 中触发?

    I used 使用 SqlDependency 检测更改作为我正在编写的代码的示例 我还查看了具有类似代码的其他链接 但它们都不起作用 本质上 我只是想改变label1 Text当表发生更改时 ErrorLog 因为某些原因 OnDepen
  • Node.js 到 MongoDB:按日期查找

    从 Node 到 MongoDB 查找日期出现问题 有人说 MongoDB 可能不是存储日期对象 而是存储字符串 但我不确定如何检查或如何修复它 在我的 Turnys js 文件中 exports findNeededTurnys func
  • 如何在 Python 中将条件语句与 for 循环结合起来?

    我有一个简单的例子 我认为在 Python 中可以用最少的努力将 if 语句和 for 循环结合起来 鉴于 sublists number1 number2 number3 for sublist in sublists if sublis
  • 从 NSString 获取 ivar 或属性

    我们能得到一个ivar or a property from a NSString就像我们可以得到一个class from a NSString与功能NSClassFromNSString 对于任何属性 您都可以使用 object valu
  • 手机号码验证安卓

    我想通过从用户的手机发送短信来将手机号码验证集成到我的 Android 应用程序中 那么除了向用户的手机发送短信之外 是否有任何 API 允许通过发送短信来验证手机号码 我建议cognalys for android 演示应用程序可在应用商
  • 使用scanf()输入字符的问题

    我正在尝试将一个字符输入到链接列表中 其中该字符可以是 A a G g T t C 或 c 我还不熟悉 C 我知道我在这里搞砸了一些事情 do printf nEnter a new nucleotide n scanf c newChar
  • BigQuery SQL 排除不在空结果中

    我遇到了不返回任何值的问题 数据库中有符合此条件的帐户 有点困惑为什么他们没有被退回 有什么建议么 select accountid from table1 where not in select accountid from table1
  • 如何构建 cURL 并在 Code::Blocks 项目中使用它(静态)

    我知道有很多关于此的主题 但它们都没有帮助我解决我的问题 我只想做一个简单的C 程序使用cURL with 静态库卷曲 没有 DLL 文件 上代码 块 Windows 8 我花了大约 20 个小时尝试这样做 但我发现的都是无用的东西和我不明
  • 位置:Windows Phone 7 中固定

    我正在尝试创建 PhoneGap Windows Phone 7 应用程序 为了模仿应始终在横向屏幕左侧可见的应用程序栏 我想放置一个 div CSS 为position fixed 然而 这不起作用 因为 WP7 上的 IE 似乎不支持它
  • 是否可以使用 MTOM 来响应 CXF RESTful Web 服务

    我在用着CXF 2 2 12我的 Web 服务的库 是否可以使用MTOM 消息传输优化机制 in RESTful回复 希望有任何与此相关的文档 教程的链接 谢谢 MTOM 是特定于 SOAP 的 因此我认为它与 RESTful 架构不兼容
  • 从张量的每个正面切片中提取对角线元素

    我有一个 p p n 张量 我想提取每个 p by p 切片的对角线元素 有谁知道如何在不循环的情况下做到这一点 谢谢 Behold永远强大 永远强大bsxfun for vectorizing MATLAB problems使用非常有效地
  • 如何在IOS sdk(Objective-c)中序列化一个类?

    如何在 Objective C 中序列化以下类 以便它可以与 SBJson 一起使用 当我使用此代码时 出现 动物不支持 JSON 序列化 错误 有人可以指出我哪里出错了吗 Animal h文件的内容如下 import
  • 如何通过publishAdd()通知获取添加的记录(不仅仅是id)?

    Each Sails js模型有方法publishAdd 当新记录添加到关联模型时 这会通知每个侦听器 此通知不包含新创建的记录 所以我必须从客户端发起另一个请求来获取新记录 Sails js 是否有可能发送带有通知的新记录 以便我可以减少
  • 在 java 中完成 FTP 后创建 0 kb 文件

    我正在尝试将文件通过 FTP 传输到远程计算机上 下面是我的代码 FTPClient ftpClient new FTPClient ftpClient connect home abc com ftpClient login remote
  • 如何在文本框中仅允许整数? [复制]

    这个问题在这里已经有答案了 在我的表单中 我希望仅允许在文本框中输入整数值 怎么做 您可以为此使用正则表达式验证器 下面是示例代码
  • 如何在 iOS 中发布 CGImageRef

    我正在编写这个方法来计算图像的平均 R G B 值 以下方法将 UIImage 作为输入并返回包含输入图像的 R G B 值的数组 但我有一个问题 如何 在哪里正确释放 CGImageRef NSArray getAverageRGBVal