2014-12-02 83 views
3

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

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

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

2)缩小图片,使NSImageView可以立即显示它们(我不在乎分辨率太多)。 您可以多快地缩放图片?

谢谢!

+0

也许会创建类似库的东西(如iPhoto或光圈),并将图像保存在那里,或者如果这不可能只是所有已查看图片的路径。无论如何,您可以为每张图片保存缩略图(如缓存)。文件名当然是不够的,你需要一个散列,因为用户可能会改变图像,但保留文件名。 (或者,如果某个路径中的某个对象发生更改,您可以使用新的Finder API来获得通知,但我并不熟悉这一点)。这是一个有点hacky和更多的解决方法,但它可能是一个起点... – HAS 2014-12-02 18:21:37

+1

另一种选择(或扩展)将缩小文件夹中的所有图像(或最有可能接下来选择的那些用户)并将它们保存在数据库中。您可以在后台线程中执行此操作,以便界面始终负责。我认为让NSImageView调整图像大小是最糟糕的解决方案,因为它将整个图像保存在内存中(如果我没有记错的话),将图像加载到视图中是一种阻塞操作。 – HAS 2014-12-02 18:26:15

+1

@是的,我现在的解决方案是:当用户选择一个文件夹时,如果文件夹内有任何大图像,我会询问用户是否要预先处理图像。如果他们接受,我创建一个缩小图像的临时文件夹。如果没有,该应用程序只需要一段时间来显示较大的图像。它不是很干净,这就是为什么我试图找到更好的解决方案。 – Diego 2014-12-02 18:40:14

回答

1

您可以在显示给定图像时预先载入上一张和下一张图像。您只需构建一个3 NSImage的表格,根据需要移动它们并加载一个新表格。这样在显示图像之前几乎所有的图像都已经加载完毕。当然,如果你按键速度非常快,这将不起作用。如果需要,您还可以预加载任意数量的图像。请记住NSImage里面有一个缓存机制。

+0

谢谢。我不久前尝试过这样的事情,但遇到了一些问题。要再试一次,看看它是如何工作的! – Diego 2014-12-02 19:02:18

2

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个像素)。请参阅中的第4部分提取缩略图...文档以获取解释RAW数据的帮助。

+0

嘿谢谢!这是很多有用的信息。唯一的问题是我可能需要为CR2,CRW,NEF等做单独的事情。我将用CR2进行测试,看看它是如何发展的。谢谢! – Diego 2014-12-02 20:00:19