使用 ImageView 快速连续显示多张图像

2023-12-19

我有一个应用程序,在一个窗口中,有一个 NSImageView。用户应该能够将任何文件/文件夹(不仅仅是图像)拖放到图像视图中,因此我对 NSImageView 类进行了子类化以添加对这些类型的支持。

我选择 NSImageView 而不是普通视图的原因是,当用户将鼠标悬停在准备放置的文件上时,我还想显示动画(例如指向下并向上和向下的箭头)。我的问题是:最好的方法是什么(最有效、最快、最少的 CPU 使用率等)?

事实上,我已经做到了,但让我问这个问题的是,当我将图像设置为以低于 0.02 秒的速度变化时,它开始滞后。我是这样做的:

在 NSImageView 子类中:

  • 有一个 ivar:NSTimer* animTimer;
  • 覆盖 awakeFromNib,调用 [super awakeFromNib] 并使用 NSImage 将图像加载到数组中(大约 45 个图像)
  • 每当用户输入文件时,以频率 = 0.025(越少则滞后)启动 animTimer,以及设置数组中下一个图像的选择器(称为 drawNextImage)
  • 每当用户退出或结束拖放时,调用 [animTimer invalidate] 停止更新图像

这是我在子类中设置图像的方法:

- (void)drawNextImage
{
    currentImageIndex++; // ivar / kNumberDNDImages is a constant defined as 46
    if (currentImageIndex >= kNumberDNDImages) { currentImageIndex = 0;}
    [super setImage: [imagesArray objectAtIndex: currentImageIndex]]; // imagesArray is ivar
}

那么,我怎样才能足够快地做到这一点呢?我希望频率约为 0.01 秒,但滞后小于 0.025,所以这就是我目前的设置。哦,我的图像大小正确(+或-一个像素或其他),并且它们是.png格式(我需要透明度 - 例如,jpeg就不能做到这一点)。

EDIT:

我尝试遵循 NSResponder 的建议,并将我的方法更新为:

- (void)drawNextImage
{
    currentImageIndex++;
    if (currentImageIndex >= kNumberDNDImages) { currentImageIndex = 0;}
    NSRect smallImgRect;
    smallImgRect.origin = NSMakePoint(kSmallImageWidth * currentImageIndex, [self.bigDNDImage size].height); // Up left corner - ??
    smallImgRect.size = NSMakeSize(kSmallImageWidth, [self.bigDNDImage size].height);

    // Bottom left corner - ??
    NSPoint imgPoint = NSMakePoint(([self bounds].size.width - kSmallImageWidth) / 2, 0);

    [bigDNDImage drawAtPoint: imgPoint fromRect: smallImgRect operation: NSCompositeCopy fraction: 1];
}

我还将此方法和其他拖放方法从 NSImageView 子类移至我已有的 NSView 子类。除了超类和此方法之外,一切都完全相同。我还修改了一些常量。

在我对此的早期测试中,我收到了一些错误/警告消息,这些消息并没有停止执行谈论 NSGraphicsContext 或其他内容。这些现在已经消失了,但只是让你知道。我完全不知道他们为什么出现以及他们的意思。如果他们再次出现,我会担心他们,而不是现在:)

EDIT 2:

这就是我现在正在做的事情:

- (void)drawNextImage
{
    currentImageIndex++;
    if (currentImageIndex >= kNumberDNDImages) { currentImageIndex = 0;}
    [self drawCurrentImage];
}
- (void)drawCurrentImage
{
    NSRect smallImgRect;
    smallImgRect.origin = NSMakePoint(kSmallImageWidth * currentImageIndex, 0); // Bottom left, for sure
    smallImgRect.size = NSMakeSize(kSmallImageWidth, [self.bigDNDImage size].height);

    // Bottom left as well
    NSPoint imgPoint = NSMakePoint(([self bounds].size.width - kSmallImageWidth) / 2, 0);

    [bigDNDImage drawAtPoint: imgPoint fromRect: smallImgRect operation: NSCompositeCopy fraction: 1];
}

这里的问题是在调用drawRect时调用drawCurrentImage(看,它实际上比我想象的更容易解决)。

现在,我必须说我还没有对合成图像进行过尝试,因为我找不到一种好的、快速的方法来按照我想要的方式合并 40 多个图像(一个挨着另一个)。但对于那些不感兴趣的人,我修改了它以执行与 NSImageView 子类相同的操作(从数组中读取 40 多个图像并显示它们),并且我发现没有减速:NSView 与 NSImageView 一样滞后于 0.025 以下。另外,我在使用核心动画时发现了一些问题(图像绘制在奇怪的地方,而不是我告诉她的地方)和一些关于 NSGraphicsContext 的警告,我根本不知道如何解决(我是一个完整的人)当涉及到使用 Objective-C 工具进行绘图等方面时,我是菜鸟)。所以目前我正在使用 NSImageView,除非我找到一种方法来合并所有这些图像并尝试使用 NSView。


核心动画可能是最快的,因为它会在 GPU 上完成所有操作。为每个图像创建一个图层,设置每个图层的contents到您可以从每个图像制作的 CGImage 中,将它们全部添加为单个顶级图层的子图层,在普通 NSView 中托管顶层 http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSView_Class/Reference/NSView.html#//apple_ref/occ/instm/NSView/setWantsLayer%3a,然后只需切换每个图像层的hidden财产依次。

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

使用 ImageView 快速连续显示多张图像 的相关文章

  • 如何在 iOS 上捕获的视频中添加水印[重复]

    这个问题在这里已经有答案了 我想知道是否有人可以告诉我如何实现这一目标 如果一直在考虑几个解决方案 从捕获的视频创建单独的图像 然后将它们合并到每个图像中 然后创建一个新的 AVAsset 听起来有点复杂 您不觉得吗 合并2个视频 一个是透
  • 简单的 iPhone 运动检测

    我需要检测陀螺仪 加速度计何时被激活一定量 基本上是检测设备何时移动 我对核心运动一无所知 也许有人可以指导我入门教程或其他东西 提前致谢 我认为你必须使用 Core Motion 好消息是 它对于您的问题域来说并不难使用 开始阅读事件处理
  • didReceiveRemoteNotification 将用户带到正确的视图

    我有一个聊天应用程序 当发送新消息时 我的服务器会发送推送通知 我遇到的问题是如何将用户带到正确的视图 我正在发送一个channelID在推送通知中 但我如何检索它并将用户带入实际对话 我使用此代码来检测何时单击推送通知 void appl
  • 当前收据无效或不匹配的 ds 人员 ID

    我正在尝试测试 MacOS 的应用内购买 输入测试用户凭据后 App Store 抱怨 当前收据无效或 ds 人员 ID 不匹配 并且购买失败 我尝试了很多方法来解决这个问题 获取 App Store 收据 http www kotanco
  • 改进C++逐行读取文件的能力?

    我正在解析大约 500GB 的日志文件 我的 C 版本需要 3 5 分钟 我的 Go 版本需要 1 2 分钟 我正在使用 C 的流来流式传输文件的每一行以进行解析 include
  • 理解 Objective-C 中选择器的唯一性

    我无法理解 选择器 的部分功能 如苹果指南中所述 我把我感到困惑的部分加粗了 在 Objective C 中 选择器有两个含义 可以用来参考 当在源代码消息中使用方法时 只需使用方法的名称 到一个物体 不过 它也指的是唯一标识符 编译源代码
  • 如何在iPhone中将字节数组转换为base64字符串?

    我有一段vb代码 我需要将字节数组转换为 Base 64 字符串 下面是vb代码 如果 arrLicence Count gt 0 那么 LicenseBytes CType Array CreateInstance GetType Byt
  • 从哪里开始使用适用于 Retina 显示屏的 OpenGL 绘制程序

    我知道由于这里提到的错误 我无法将 GLPainter 示例从苹果适应到视网膜 在 Retina iPad 上显示全屏 CAEAGLLayer 时出现问题 https stackoverflow com questions 9757052
  • 使用 NSDateFormatter 和 TimeZone(不带 GMT 时间修饰符)将 NSDate 转换为 NSString

    我正在初始化我的 NSDateFormatter NSDateFormatter dateFormatter NSDateFormatter alloc init autorelease dateFormatter setLocale NS
  • 为什么反射会减慢Android手机的速度

    我多次读到反射会降低手机性能 这有多真实 例如 在我的例子中 我从 Web 服务获取一些参数 这些参数与我在 Android 应用程序中的类的参数同名 所以我只是使用java字段和反射设置这些参数的值 它似乎并没有降低性能 有人可以向我解释
  • 为什么我无法更改 UIBarButtonItem 的标题?

    我想改变UIBarButtonItem s title 但这段代码不起作用 void viewDidLoad self smay void smay AppDelegate apd AppDelegate UIApplication sha
  • 如何使用呼叫目录扩展来识别应用程序中的来电?

    我正在研究callKit框架 我发现通过使用呼叫目录扩展 我们可以识别来电电话号码 我的问题是如何在 iOS 应用程序中实现呼叫目录扩展来识别来电详细信息 我在 Objective C 工作 让一个数 919876xxxxx 使用此方法添加
  • 在两个可移动 uiview 之间画线

    我有一个带有节点的 滚动视图 UIViews 可以拖动 我正在尝试在选定的之间绘制边缘UIViews使用 calayer 但我不知道当视图位置发生变化时如何重新绘制线条 In my viewControllerI 类在节点数组中添加第一个和
  • Xcode 中的 NSObject 描述和自定义摘要

    我覆盖对象的 NSString description但是 Xcode 总是显示error summary string parsing error在变量视图的摘要字段中 我当前的实现如下 NSString description retu
  • 如何使用固定宽度和自动布局正确缩放图像?

    我有一个动态 UIImage 和一个固定宽度为 280 0px 的 UIImageView 并且我正在使用自动布局 在 UIImage 视图上 我设置了宽度和高度约束 并降低了高度约束的优先级 我选择了 aspect fit 并将内容拥抱和
  • 使用 MPMoviePlayerViewController 时的 iPad 旋转错误

    问题摘要 使用 MPMoviePlayerViewController 播放视频时更改 iPad 设备或模拟器的方向会导致视频播放器关闭时旋转状态不一致 这是 iPad SDK 3 2 中的一个已知错误 记录于http www openra
  • 为什么python+sqlite3特别慢?

    我尝试使用 Python 2 7 4 sqlite3 和 Firefox SQLite Manager 0 8 0 处理对同一数据库的相同请求 在小型数据库 8000 条记录 上 Python 和 Firefox 都运行得很快并且给出了相同
  • 如何在没有 MFMessageComposeViewController 的情况下发送和接收短信?

    我想发送和接收短信而不显示MFMessageViewController从我的申请中 有人能告诉我这怎么可能吗 不可能 除非您使用第 3 方 api 发送 接收短信
  • 共享扩展程序未出现在能够在 iPhone 上共享照片的应用程序列表中

    我正在尝试创建一个共享应用程序扩展 并按照以下来源的教程进行操作 http www technetexperts com mobile share extension in ios application overview with exa
  • 构建 iOS 应用程序后退出代码 1 错误

    我正在尝试使用 RestKit 构建我的项目 当我构建它时 我收到以下错误 我尝试使用 Apple LLVM 3 0 和 LLVM GCC 4 2 进行编译 两者都产生相同的结果 任何人有任何想法是什么导致了这个问题 Ld Users Ji

随机推荐

  • 使用 python/PIL 的图像轮廓

    我有一张苹果的彩色照片 如何用 python PIL 只显示它的轮廓 内部白色 背景黑色 像这样的东西应该有效 from PIL import Image ImageFilter image Image open your image pn
  • user_pseudo_id 的计数与 Firebase 仪表板中显示的数字不同

    我正在使用 Firebase 并希望通过 BigQuery 计算每日活跃用户数 但数字与仪表板中显示的数字不同 我尝试了以下查询 SELECT count distinct user pseudo id as dau FROM xxxx e
  • 是否有不同类型的 NULL?

    这来自
  • 如何将 Java Pojo 转换为 Nashorn Json?

    我有一个 Java 对象 我想将其转换为 json 对象并传递给 Nashorn javascript 引擎 谷歌搜索这个问题的答案是非常困难的 有人可以告诉我该怎么做吗 我试过这个 ObjectMapper mapper new Obje
  • javascript正则表达式删除括号中的尾随数字

    我如何替换 追加something 22 字符串到something 使用某种匹配某物的表达式不是常量 它总是不同的 但部分 整数 总是相同的 干杯 EDIT 我发现这有点令人困惑 对我来说也是如此 这就是我的意思 我有一个字符串 一个词
  • 如何在 Android UI 中设置布局背景

    我是 Android 编程新手 我有一个带有一些的用户界面TextView and Button控制 如何在这些组件后面设置背景 我们称之为background png 在您的父布局元素中 例如线性布局或其他 只需添加android bac
  • 解释如何在 Rails 中利用 order 子句

    我很难理解这一部分是如何从这个网站关于 Rails SQL 注入 http rails sqli org resources works 在 ORDER BY 子句中利用 SQL 注入很棘手 但 CASE 语句可用于测试其他字段 将排序列切
  • 使用 Azure Active Directory 访问 Azure Function 时,Blazor 客户端出现 CORS 错误

    我已经尝试部署 Blazor PWA 两天了 到目前为止没有任何成功 如果有人知道我做错了什么 我将非常感激 你好 我可以自己解决大部分问题 但现在使用 AAD 遇到了 CORS 问题 这是我的项目设置 Blazor WebAssembly
  • 查找无序字谜对子串的数量

    我正在尝试解决以下问题 https www hackerrank com challenges sherlock and anagrams https www hackerrank com challenges sherlock and a
  • Web 应用程序编译错误 - ASP.NET 参考

    我当前的 Web 应用程序在本地和实时运行良好 我当前正在使用 Visual Studio 选项 添加 Web 部署项目 编译我的 Web 应用程序 以便所有后面的代码都编译到 DLL 中 有一个特定的构建错误我无法摆脱 错误 50 命名空
  • 为了清晰起见,重构嵌套 IF 语句[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我想重构这个繁琐的方法以使其更具可读性 它有太多我喜欢的嵌套 IF 你会如何重构这个 public static void HandleUplo
  • CQRS - 是否允许从写入端调用读取端?

    我开始阅读有关 CQRS 的内容 但我有点困惑 是否允许在写入端调用读取端来获取附加信息 http cqrs nu Faq command handlers http cqrs nu Faq command handlers在这里他们说这是
  • 将 Postgres \i 输入的输出放入文件?

    快速问题 我希望 如果我使用 i 将输入文件输入 psql 我可以将查询的输出保存到文件中吗 如果是这样 怎么办 谢谢 Using o正如其他人所推荐的 是一个很好的解决方案 不过 只是为了好玩 另一种方法是将输入文件通过管道传输到psql
  • Facebook Messenger 客户聊天插件在未登录时不显示

    我已在我们的网站之一上集成了 Facebook 客户插件 我按照开发人员文档中的说明进行操作 当有活跃的 Facebook 会话时 它工作正常 但是 当没有活动的 Facebook 会话时 该插件根本不会出现 我可能错过了一些东西 但我不知
  • React Native listview:当行到达底部时如何将行粘在屏幕底部

    Using stickyHeaderIndices Ref 粘性标题索引 https facebook github io react native docs listview html stickyheaderindices 在 Reac
  • 将文件设置保存在 ini 而不是注册表中

    我是 MFC 新手 在 myApp InitInstance 中创建第一个应用程序后 我有 SetRegistryKey T Local AppWizard Generated Applications 我可以删除它并将设置保存到我自己的
  • 如何在 html/css 中将图像旁边的文本垂直居中?

    在 html 中将图像旁边的文本垂直居中的最佳和最简单的方法是什么 需要与浏览器版本 类型无关 纯 html CSS 解决方案 这可能会让你开始 http phrogz net CSS vertical align index html 我
  • C++ 中有“byte”数据类型吗?

    如果存在 是否需要包含头文件 此代码会导致编译错误 int main byte b 2 error 不 没有所谓的类型 byte 在 C 中 你想要的是unsigned char 或者 如果您正好需要 8 位 uint8 t from
  • 从 Fortran 中读取 C++“Hello World”

    我正在尝试验证一个用 c 编写的简单的 hello world 函数可以从 FORTRAN 脚本 gfortran 4 9 20 调用 我对 c 和 FORTRAN 都没什么经验 所以我认为这是我应该开始的 code cpp include
  • 使用 ImageView 快速连续显示多张图像

    我有一个应用程序 在一个窗口中 有一个 NSImageView 用户应该能够将任何文件 文件夹 不仅仅是图像 拖放到图像视图中 因此我对 NSImageView 类进行了子类化以添加对这些类型的支持 我选择 NSImageView 而不是普