NSImageView:显示大图像

时间:2014-12-02 17:30:20

标签: objective-c macos nsimage nsimageview

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

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

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

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

谢谢!

2 个答案:

答案 0 :(得分: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 像素。有关解释RAW数据的帮助,请参阅提取缩略图... 文档中的第4部分。

答案 1 :(得分:1)

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