Отображение больших изображений на iOS без предварительно вырезанных плиток
Я создаю приложение камеры, которое сохраняет данные изображения в один файл JPEG в песочнице. Изображения в среднем около 2 МБ в размере.
Проблема: я не могу отобразить изображения в программе просмотра фотографий, потому что наличие нескольких изображений в памяти выдает предупреждения памяти и делает прокрутку изображений очень медленной.
Я не могу разбить изображение на плитки и сохранить их на диск, потому что это даже дороже, чем показ одного изображения. Я попытался разделить изображение на плитки при захвате, но на 5S в среднем потребовалось 5 1/2 секунд, чтобы сохранить все плитки на диск. От этого будет только хуже, так как приложение выполняется на старых устройствах. Это очень плохо, потому что, если у пользователя есть приложение в середине сохранения? У меня будут отсутствующие листы и не распакованный исходный файл, чтобы найти недостающие листы позже.
Вопрос: как лучше всего показать полноразмерное изображение без проблем с памятью и быстрой прокрутки? Тонны приложений камеры в App Store делают это, и приложение Фотографии делает это, должно быть хорошее решение.
Примечание. В настоящее время я показываю миниатюру изображения, а затем загружаю полноразмерное изображение с диска в другой поток. После завершения загрузки полноразмерного изображения я представляю полноразмерное изображение в основном потоке. Это устраняет проблемы с памятью, потому что у меня есть только одно полноразмерное изображение в памяти одновременно с двумя миниатюрами, но все равно вызывает отставание в просмотре прокрутки, потому что рисование полноразмерного изображения в основном потоке все еще довольно дорого.
Я был бы очень признателен за любой вклад!
2 ответа
Одним из способов справиться с этим является мозаика изображения. Вы можете сохранить большое распакованное изображение на "диске" в виде серии плиток, а когда пользователь перемещается, вынимает только те плитки, которые вам нужны для отображения. Вам когда-либо понадобится только один фрагмент памяти за раз, потому что вы рисуете его на экране, затем выбрасываете его и загружаете следующий фрагмент. (Возможно, вы захотите кэшировать видимые листы в памяти, но это деталь реализации. Даже использование всего изображения в виде плиток может снизить нагрузку на память, поскольку вам не нужен один большой непрерывный блок.)
Вот как приложения, такие как Photoshop, справляются с этой ситуацией.
Второй способ, который я предлагаю вам, это проверить пример от Apple для обработки больших изображений под названием PhotoScroller. Изображения уже выложены плиткой. Если вам нужен пример мозаики изображения в Какао, посмотрите cimgf.com
Надеюсь, это поможет вам.
Вы могли бы..
- создать ноготь большого размера
- создайте уменьшенное изображение и сохраните его в другой папке "песочницы"... и прочитайте его для просмотра... затем после этого загрузите изображение, если пользователь хочет посмотреть его в полном размере.