Обработка больших изображений в iOS

Я хочу разрешить пользователю выбирать фотографию, не ограничивая размер, а затем редактировать ее.

Моя идея - создать миниатюру большой фотографии с тем же размером, что и экран для редактирования, а затем, когда редактирование закончится, используйте большую фотографию, чтобы сделать то же самое редактирование, которое было выполнено на миниатюре.

Когда я использую UIGraphicsBeginImageContext для создания уменьшенного изображения, это вызовет проблему с памятью.

Мне трудно отредактировать все большое изображение напрямую из-за ограничений по аппаратным средствам, поэтому я хочу знать, есть ли способ уменьшить размер большого изображения до менее 2048 * 2048 с проблемами памяти?

Я обнаружил, что существует класс BitmapFactory, у которого есть опция inSampleSize, которая может уменьшить выбор фотографии на платформе Android. Как это можно сделать на iOS?

Ответ 1

Вам нужно обработать загрузку изображений с помощью UIImage, который фактически не загружает изображение в память, а затем создает контекст растрового изображения с размером полученного результирующего изображения (так что это будет объем используемой памяти). Затем вам нужно повторить несколько раз рисование плиток с исходного изображения (это то, где части данных изображения загружаются в память) с использованием CGImageCreateWithImageInRect в целевом контексте с помощью CGContextDrawImage.

Смотрите этот пример кода из Apple.

Ответ 2

Большие изображения не помещаются в память. Таким образом, загрузка их в память, чтобы затем изменить их размер, не работает.

Чтобы работать с очень большими изображениями, вы должны их плитку. Многие решения там уже, к примеру, видят, может ли это решить вашу проблему:

https://github.com/dhoerl/PhotoScrollerNetwork

Я реализовал свое собственное решение, но это было специфично для нашей среды, где у нас уже был сервер-образчик, и я мог просто запросить определенные фрагменты больших изображений (сделал сервер, это действительно здорово)

Причина, по которой работает плитка, заключается в том, что в основном вы только сохраняете видимые пиксели в памяти, и их не так много. Все фрагменты, которые в настоящее время не отображаются, выставляются в кеш диска или в кеш флеш-памяти.

Ответ 3

Взгляните на эту работу Тревора Хармона. Это улучшило производительность моего приложения. Я считаю, что это сработает и для вас.

https://github.com/coryalder/UIImage_Resize