2014-12-02 85 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