【问题标题】:NSImageView: display large imagesNSImageView:显示大图
【发布时间】:2014-12-02 17:30:19
【问题描述】:

我正在为 OS X 开发一个图像浏览器应用程序。它与 QuickLook 非常相似:您选择一个文件夹,应用程序会显示其中的第一张图像,您可以使用箭头键快速移动到下一张/上一张照片。

现在,我正在使用非常大的 RAW 格式图片测试我的应用程序:例如,我有一个将近 25 MB 的 .cr2 文件。 NSImageView 加载此类图片需要 5 到 10 秒。我希望从一张图片到下一张的过渡尽可能快。我看到 2 个选项:

1) 增量加载图片并在加载时显示它(通过块或逐步提高分辨率)。 可以这样做吗?怎么样?

2) 缩小图片以便 NSImageView 可以立即显示它们(我不太关心分辨率)。 图片缩放速度有多快?

谢谢!

【问题讨论】:

  • 也许可以创建一个库之类的东西(如 iPhoto 或光圈),然后将图像保存在其中,或者如果这不可能,则只保存所有已查看图片的路径。在任何情况下,您都可以在其中保存每张图片的缩略图(如缓存)。文件名当然是不够的,你需要一个哈希,因为用户可能会更改图像但保留文件名。 (或者,如果某个路径上的对象发生变化,您可以使用新的 Finder API 来获得通知,但我对此并不熟悉)。这有点老套,更多的是一种解决方法而不是解决方案,但它可能是一个起点......
  • 另一种选择(或扩展)是缩小文件夹中的所有图像(或用户接下来最有可能选择的图像)并将它们保存在数据库中。您可以在后台线程中执行此操作,以便接口始终负责。我认为让 NSImageView 调整图像大小是最糟糕的解决方案,因为它将整个图像保存在内存中,并且(如果我没记错的话)将图像加载到视图中是一个阻塞操作。
  • @HAS 是的,我现在的解决方案是:当用户选择一个文件夹时,如果文件夹内有任何大图像,我会询问用户是否要对图像进行预处理。如果他们接受,我会创建一个包含缩小图像的临时文件夹。如果没有,该应用程序只需要一段时间来显示更大的图像。它不是很干净,这就是我试图找到更好的解决方案的原因。

标签: objective-c macos nsimage nsimageview


【解决方案1】:

这 5-10 秒可能是由于将 RAW 数据转换为NSImageView 可以显示的格式。仅仅从磁盘读取 25MB 就会造成延迟,而处理所有这些数据会增加更多。只要有可能,您都希望避免该转换过程。

CR2 文件可以包含小型 JPEG 预览图像,读取小型缩略图肯定比转换 25MB 文件快得多。网页Inside the Canon RAW format version 2 有很多关于CR2 文件结构的信息,可以帮助您找到任何缩略图。另一个页面 Extracting thumbnails from camera RAW files (.CR2 and .NEF) with PHP 演示了如何从 CR2 文件中提取缩略图。

如果文件中包含的缩略图不足以满足您的需求,您必须让NSImageView 或其他一些组件为您转换文件,或者编写您自己的转换器。上面第一个链接中的 CR2 格式信息应该可以帮助您找到 RAW 数据本身,并且您可能会比通过仅读取每 n 行像素来转换整个图像更快地构建预览图像(然后仅使用您读取的行中的每个第 n 个像素)。请参阅 Extracting thumbnails... 文档中的第 4 部分,以获得解释 RAW 数据的帮助。

【讨论】:

  • 嘿,谢谢!这是很多有用的信息。唯一的问题是我可能需要为 CR2、CRW、NEF 等做单独的事情。我将使用 CR2 进行测试,看看情况如何。谢谢!
【解决方案2】:

您可以在显示给定图像时预加载上一个和下一个图像。您只需构建一个包含 3 个NSImage 的表,根据需要移动它们并加载一个新表。这样您的图像几乎在显示它们之前就已经加载了。当然,如果您快速按键,这将不起作用。如果需要,您还可以预加载任意数量的图像。请记住,NSImage 内部有缓存机制。

【讨论】:

  • 谢谢。我前一段时间尝试过这样的事情,但遇到了一些问题。会再试一次,看看效果如何!
猜你喜欢
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 2021-02-18
  • 1970-01-01
  • 2013-08-26
  • 2011-09-26
  • 2013-02-06
  • 1970-01-01
相关资源
最近更新 更多