如何找到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瓶颈 的相关文章

随机推荐

  • 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 使用我的应用程序包中的图像 我一直在添加功能 以允许用户使用