如何找到UIImage瓶颈

2023-12-30

我有一个应用程序使用UIImage对象。到目前为止,我一直在使用使用如下方式初始化的图像对象:

UIImage *image = [UIImage imageNamed:imageName];

使用我的应用程序包中的图像。我一直在添加功能,以允许用户使用相机或其库中的图像UIImagePickerController。显然,这些图像不能出现在我的应用程序包中,因此我初始化了UIImage以不同的方式反对:

UIImage *image = [UIImage imageWithContentsOfFile:pathToFile];

这是在首先将图像大小调整为与我的应用程序包中的其他文件相似的大小(像素尺寸和总字节数)之后完成的,两者都使用 Jpeg 格式(有趣的是,即使文件大小相同,PNG 也要慢得多)。换句话说,文件指向pathToFile是与捆绑中的图像大小相似的文件(像素尺寸匹配,并且选择了压缩,因此字节数相似)。

该应用程序通过一个循环从原始图像中制作小块,以及与本文无关的其他内容。我的问题是,使用第二种方式创建的图像进行循环比使用第一种方式创建的图像花费更长的时间。

我意识到第一种方法会缓存图像,但我认为这无关紧要,除非我不了解缓存的工作原理。如果是相关因素,如何在第二种方法中添加缓存?

导致瓶颈的相关代码部分是这样的:

[image drawInRect:self.imageSquare];

这里,self是UIImageView的子类。它的属性 imageSquare 只是一个CGRect定义绘制的内容。这部分对于两种方法来说是相同的。那么为什么第二种方法在大小相似的情况下慢得多UIImage object?

我可以采取不同的措施来优化这个过程吗?

编辑:我将对捆绑中图像的访问权限更改为imageWithContentsOfFile执行循环的时间从大约 4 秒变为一分多钟。所以看来我需要找到一些方法来进行缓存imageNamed可以,但是使用非捆绑文件。


UIImage imageNamed不只是缓存图像。它缓存一个未压缩的图像。花费的额外时间不是由从本地存储读取到 RAM 引起的,而是由解压缩图像引起的。

解决方案是创建一个新的未压缩UIImage对象并将其用于代码的时间敏感部分。当该部分代码完成时,未压缩的对象将被丢弃。为了完整起见,这里是返回未压缩的类方法的副本UIImage来自压缩对象,感谢另一个线程 https://stackoverflow.com/questions/924740/dispelling-the-uiimage-imagenamed-fud。请注意,这假设数据位于CGImage。但这并不总是正确的UIImage对象。

+(UIImage *)decompressedImage:(UIImage *)compressedImage
{
   CGImageRef originalImage = compressedImage.CGImage;
   CFDataRef imageData = CGDataProviderCopyData(
                         CGImageGetDataProvider(originalImage));
   CGDataProviderRef imageDataProvider = CGDataProviderCreateWithCFData(imageData);
   CFRelease(imageData);
   CGImageRef image = CGImageCreate(
                                CGImageGetWidth(originalImage),
                                CGImageGetHeight(originalImage),
                                CGImageGetBitsPerComponent(originalImage),
                                CGImageGetBitsPerPixel(originalImage),
                                CGImageGetBytesPerRow(originalImage),
                                CGImageGetColorSpace(originalImage),
                                CGImageGetBitmapInfo(originalImage),
                                imageDataProvider,
                                CGImageGetDecode(originalImage),
                                CGImageGetShouldInterpolate(originalImage),
                                CGImageGetRenderingIntent(originalImage));
   CGDataProviderRelease(imageDataProvider);
   UIImage *decompressedImage = [UIImage imageWithCGImage:image];
   CGImageRelease(image);
   return decompressedImage;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何找到UIImage瓶颈 的相关文章

  • Swift - 我可能已经删除了 Apple Swift Packages 集合

    我对 swift 和 XCode 很陌生 昨天我正在开发一个项目 想尝试一下某人制作的自定义日期选择器 所以我转到 添加包 并粘贴 GitHub 链接并添加它 我已经在我的项目中添加了一个名为 KeychainAccess 的不同包 方式
  • iOS - UIBarButtonItem - 后退按钮标题垂直位置不调整

    我正在设置自定义字体UIBarButtonItem对象使用UIAppearance 这工作正常并正确设置字体 但是 我确实需要调整按钮标题的垂直位置以适应新字体的大小 UIBarButtonItem appearance setTitleT
  • React Native Detox:无法接受系统警报弹出的位置权限

    使用以下命令从命令行启动应用程序detox test configuration ios sim debug 通过代码启动应用程序await device launchApp permissions location always noti
  • ios如何搜索目录

    我想知道如何检查我的应用程序中是否存在目录 例如 如果我想搜索我的应用程序文档中是否存在文件夹 以及如何在其中创建新文件夹 此致 检查文件是否存在 BOOL fileExistsAtAbsolutePath NSString filenam
  • UICollectionViewCell 拖动预览的自定义视图

    我正在尝试实现一项功能 用户可以将一个集合视图单元格拖放到另一个集合视图单元格上 但是 我想完全更改运动中物体的预览 以匹配我的应用程序的视觉隐喻 该项目没有移动 该项目包含的东西正在移动 例如 假设我的collectionview单元格显
  • 为什么我需要 2 个或更多核心数据模型?

    我很想知道谁使用多个核心数据模型以及为什么 有什么好处 我正在开发一个应用程序 我认为我可以从多个模型中受益 但我不确定其他好处 我即将推出的应用程序将适用于 iPad 和 iPhone 的另一个版本 iPad 有 3 个主要内容 iPho
  • 如何使用 Objective-C 解析 JSON?

    我是 iPhone 新手 谁能告诉我解析此数据并获取活动详细信息 名字和姓氏的步骤 error false data activity id 35336 user id 1 user first name Chandra Bhusan us
  • 核心数据executeFetchRequest消耗大量内存

    我正在核心数据数据库中插入 cca 100 000 条记录 数据库包含 3 个实体 球员 俱乐部 球员俱乐部 实体之间存在关系 玩家 gt 玩家俱乐部俱乐部 在 PlayerClub 中插入时 我注意到插入大约 50 000 条记录后会消耗
  • 使用 HTTP NSURL 创建 AVAsset

    我正在尝试合并两个NSURLs包含视频参考 其中一个 URL 指向 AWS 上的视频 另一个 URL 指向本地存储的视频 我的导出代码有效 因为我已经尝试使用两个本地视频 但每当我尝试合并 HTTP url 和本地 url 时 我都会收到此
  • 当您从不同的视图控制器进行segue时,如何将数据从一个视图控制器保存(追加)到另一个视图控制器?

    抱歉 问题有点长 请多多包涵 基本上 我正在尝试使用 swift 编写一个简单的递增 递减 ios 应用程序 我有三个主视图控制器 一个是 初始视图控制器 即根视图控制器 仅包含两个按钮 一个以模态方式呈现到实际计数页面 第二个视图控制器
  • AST 文件格式错误或损坏

    我有一个问题 我不知道为什么会发生这种情况 但很可能是因为我错误地按了 移动到垃圾箱 到某些系统框架 我收到一条错误消息 AST 文件格式错误或损坏 找不到 AST 文件引用的文件 Users username myProject Quar
  • iPad 横向框架宽度和高度混合

    我已经完成了这个问题所说的 横向模式仅适用于 iPhone 或 iPad https stackoverflow com questions 2647786 landscape mode only for iphone or ipad 但v
  • Swift 字典映射 - 闭包中的 init

    我有 Swift 字典 private var params String AnyObject 这包含查询项目 例如 lat 40 lon 100 我想将这本词典映射到NSURLQueryItem大批 我想让它 迅速 params map
  • -[_SwiftValueencodeWithCoder:]:无法识别的选择器发送到实例

    尝试使用 NSCoder 时出现错误 玩家 swift class Player NSObject NSCoding private var playerName String private var playerScore Int pri
  • 为什么 xcode IDE 认为 `friend` 是保留字

    我一直在开发一个个人项目 并在我创建的新类中包含以下代码 property readonly getter isFriend BOOL friend 它似乎没有任何问题 当我构建它时 它可以编译得很好 但是当我们在xcode IDE看起来像
  • 块如何捕获其封闭范围之外的变量?

    我知道 Objective C 块可以捕获并设置其封闭范围之外的变量值 它是如何做到的 它实际上相当简单 并在 Clang 的块实现规范中进行了描述 在 导入变量 http clang llvm org docs Block ABI App
  • 在 UIScrollView 中禁用 2 根手指滚动

    我想在我的应用程序中禁用两指滚动UIScrollView 我对其进行了子类化 并使用以下代码调整了其内置手势识别器 for UIGestureRecognizer mgestureRecognizer in scroller gesture
  • 在 OSX 上检测 Objective C 或 C++ 中的文件夹访问(如 fs_usage 命令)

    我正在 OSX 上开发实时病毒扫描程序 OSX 的命令行命令fs usage可以通过以下方式确定文件夹访问权限 并且只能以 root 用户身份运行 fs usage w f pathname grep Users Documents Use
  • 当键盘出现时调整 UITextView 的大小

    我想在键盘出现时调整文本视图的大小 我的代码如下 我打开了自动布局 因此使用来自超级视图的 textView gt bottom 空间的约束 并通过 IBOutlet distanceFromBottom 引用它 void keyboard
  • 如何在 Swift 中将所有 iOS 设备的标签水平居中

    我不知道如何使标签在图像视图中水平居中 标签说 You ve been here What would you rate us 我想要What would you rate us属于 You ve been here 我试图完成此操作的方法

随机推荐

  • CodeIgniter 中分页的自动加载配置不起作用

    我正在尝试在我的 CI web 应用程序中实现分页 现在我将分页配置放入这样的配置文件中
  • 使用 VB.NET 执行存储过程

    这是我的程序 ALTER PROCEDURE sp addUser UserName nvarchar 50 Prenom nvarchar 50 Nom nvarchar 50 Mail nvarchar 50 Password char
  • “静态合成”是什么意思?

    我正在查看一些从 Java 字节码获得的反汇编代码 我看到一些声明如下 method static synthetic access 0 Lcom package Sample 我不明白是什么synthetic or access 0意思是
  • SQL Server 上的 Int PK 内连接与 Guid PK 内连接。执行计划

    我刚刚对 Int PK join 与 Guid PK 进行了一些测试 表结构和记录数如下所示 在这两种情况下 使用 EF4 进行 CRUD 操作的性能非常相似 众所周知 在连接中使用 Int PK 比字符串具有更好的性能 所以SQL Ser
  • 将 Service Worker 请求中的响应修改为图像

    您好 提前谢谢您 我的问题是关于使用响应网络请求服务工作者 我能够在文本或 html 的情况下处理它 但是当我尝试处理image我失败了 这是我的代码 self addEventListener fetch function event e
  • 本地主机上的 Firebase console.log?

    拿起去年春天我离开的 Firebase 项目 我不记得是怎么做的console log工作在firebase server 我有一个函数 有效 我尝试在其中编写一些调试信息 像这样 exports myfun functions https
  • 获取对象调用层次结构

    假设我有 3 个课程 class A void do A Check object call hierarchy class B void do B A a a do A class C void do C B b b do A 然后我打电
  • Facebook iOS SDK 3.2.1 - [NSError fberrorShouldNotifyUser]:无法识别的选择器发送到实例

    我刚刚将我的应用程序从 Facebook iOS SDK 3 1 升级到 3 2 1 并且我正在尝试利用 NSError 上的新 FBError 类别提供的新错误处理 代码在底部 它编译得很好 但是当发生 FB 错误时 我在运行时得到以下信
  • R从字符串中提取数字

    字符串将是 042 195 143 192 001 145 045 125 125 如何提取最后一组数字 195 192 145 125 125 Try v1 lt c 042 195 143 192 001 145 045 125 125
  • Arduino 上的 Timer1 导致串行打印无法工作

    运行下面的代码 当我从串行监视器向 Arduino 发送任何字符时 Arduino 不会打印 a 我认为timer1代码有问题 但它应该可以工作 因为这段代码是我的C课老师给我的 void setup Serial begin 115200
  • 在 Parquet 中使用嵌套数据类型有什么好处?

    在 Parquet 文件格式中使用嵌套数据类型是否会带来任何性能优势 AFAIK Parquet 文件通常是专门为查询服务创建的 例如Athena 因此创建这些值的过程也可以简单地展平这些值 从而允许更轻松的查询 更简单的模式并保留每列的列
  • 带 proguard 的 Kotlin AAR 库:如何仅保留类和方法名称?

    我正在使用 Kotlin 构建一个 android 库 aar 文件 我需要以第三方用户将看到类和方法名称的方式混淆代码 他必须能够使用它们 它们是公开的 但我需要隐藏 混淆代码本身 我尝试将此文件用于 myLibrary proguard
  • C++ 中的模块是什么?

    该术语是什么意思module在下面的句子中引用 不允许异常跨模块边界传播 这是规则 62C 编码标准 http www gotw ca publications c cs htm作者 赫伯 萨特和安德烈 亚历山德雷斯库 我现在已经阅读了这本
  • 想要 javax.swing 钩子告诉我层次结构中的哪个组件正在执行操作

    如何通过最少的代码丑化在 Swing 程序中编写一个调试挂钩 告诉我层次结构中的哪个组件实际上正在处理每个 KeyStroke 或鼠标单击 并执行在组件的操作映射中映射到它的操作 我们正在编写一个复杂的 GUI 了解这些信息将非常有用 放入
  • 如何在谷歌地图中放置两个距离500m的标记

    我们如何将两个标记放置在 500 米的距离处 假设第一个标记的 latLng 是伦敦 51 0 第二个标记放置在距离该标记 500 米的地方 我已经尝试过任何事情 但无法找到并回答它 任何想法 纬度为 60 海里 但显然经度超出了这个范围
  • WPF DataGrid 组样式

    I have the following DataGrid in WPF with two groups First group is a bool flag which represents if a person is active i
  • 使用画布的橡皮擦效果

    我有一个扩展视图的自定义视图类 我正在使用重写的 onDraw 方法在画布上涂鸦 我有一个 POJO 列表 其中包括 Path 和 Paint 借助它们我可以重新创建绘制的旧路径 如下所示 Override protected void o
  • 视图更新后保留视图/数据模型的引用

    考虑我们有一个RootView and a DetailView DetailView有它自己的 BindableObject 我们称之为它DetailViewModel我们有这样的场景 RootView可能会被某种全局事件更新 例如错过了
  • 使用 AngularJS angular.extend 独立地向数组的每个对象添加属性

    我有一个现有数组 其中包含第一步创建的对象和多个属性 它是由以下函数创建的 scope recordlist extractRecordJSONFromLocalStorage scope addRecord function scope
  • 如何找到UIImage瓶颈

    我有一个应用程序使用UIImage对象 到目前为止 我一直在使用使用如下方式初始化的图像对象 UIImage image UIImage imageNamed imageName 使用我的应用程序包中的图像 我一直在添加功能 以允许用户使用