2014-12-02 3 views
3

Я работаю над графическим приложением для OS X. Он очень похож на QuickLook: вы выбираете папку, приложение отображает первое изображение в ней, и вы можете использовать клавиши со стрелками для быстро перейдите к следующему/предыдущему изображению.NSImageView: показать большие изображения

Теперь я тестирую свое приложение с очень большими изображениями формата RAW: например, у меня есть .cr2-файл, который составляет почти 25 МБ. Для загрузки изображений такого типа NSImageView занимает от 5 до 10 секунд. Я бы хотел, чтобы переход от картины к следующему был как можно быстрее. Я вижу 2 варианта:

1) Загрузите изображение поэтапно и отобразите его при его загрузке (либо кусками, либо путем постепенного улучшения разрешения). Можно ли это сделать? Как?

2) уменьшите снимки, чтобы NSImageView мог отображать их мгновенно (меня не слишком беспокоит разрешение). Как быстро вы можете масштабировать изображение?

Спасибо!

+0

Возможно, создайте что-то вроде библиотеки (например, iPhoto или диафрагму) и сохраните изображения там, или если это невозможно только для всех уже просмотренных изображений. В любом случае вы можете сохранить миниатюры там для каждого изображения (например, кеш). Конечно, имя файла недостаточно, вам нужен хэш, так как пользователь может изменить изображение, но сохранить имя файла. (Или вы используете новый API Finder, чтобы получать уведомление, если объект с некоторым изменением пути, но я не знаком с этим). Это все немного взломано и более обходное решение, чем решение, но это может быть отправной точкой ... – HAS

+1

Другим вариантом (или расширением) было бы сокращение всех изображений в папке (или тех, которые, скорее всего, были выбраны следующим образом пользователь) и сохранить их в БД. Вы можете сделать это в фоновом потоке, чтобы интерфейс всегда отвечал.Я думаю, что разрешение NSImageView изменить размер изображения является худшим решением, поскольку оно сохраняет весь ваш образ в памяти и (если я правильно помню), загрузка изображения в представление является блокировкой. – HAS

+1

@ НАСТОЯТЕЛЬНО Да, мое решение прямо сейчас: когда пользователь выбирает папку, если в папке есть большие изображения, я прошу пользователя, хотят ли они предварительно обработать изображения. Если они принимают, я создаю временную папку с уменьшенными изображениями. Если нет, приложение просто занимает некоторое время, чтобы отображать большие изображения. Это не очень чисто, поэтому я пытаюсь найти лучшее решение. – Diego

ответ

1

Вы можете предварительно загрузить предыдущие и следующие изображения, пока отображается данное изображение. Вам просто нужно построить таблицу из 3 NSImage, сдвинуть их по мере необходимости и загрузить новую. Чтобы ваши изображения почти всегда загружались, прежде чем показывать их. Конечно, это не сработает, если вы нажимаете клавиши очень быстро. Вы также можете предварительно загрузить любое количество изображений. Помните, что у NSImage есть механизм кеширования внутри.

+0

спасибо. Я попробовал что-то вроде этого некоторое время назад, но у меня возникли проблемы. Попробуй еще раз и посмотрим, как это работает! – Diego

2

Это 5-10 секунд, вероятно, связано с преобразованием RAW-данных в формат, который может отображать NSImageView. Просто чтение 25 МБ с диска будет налагать задержку, и обработка всех этих данных добавит больше. Когда это возможно, вы захотите избежать этого процесса конверсии.

Файлы CR2 могут содержать небольшие изображения предварительного просмотра JPEG, и было бы намного быстрее прочитать небольшой миниатюру, чем преобразовать файл размером 25 МБ. На веб-странице 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

Смежные вопросы