Обработка больших изображений в iOS
Я хочу разрешить пользователю выбирать фотографию, не ограничивая размер, а затем редактировать ее.
Моя идея состоит в том, чтобы создать миниатюру большой фотографии того же размера, что и экран для редактирования, а затем, когда редактирование закончится, использовать большую фотографию, чтобы выполнить то же редактирование, что и для миниатюры.
Когда я использую UIGraphicsBeginImageContext
чтобы создать уменьшенное изображение, это вызовет проблемы с памятью.
Я знаю, что трудно редактировать все большое изображение напрямую из-за аппаратных ограничений, поэтому я хочу знать, есть ли способ уменьшить размер большого изображения до 2048*2048 без проблем с памятью?
Я обнаружил, что есть BitmapFactory
Класс, который имеет inSampleSize
опция, которая может уменьшить фото на платформе Android. Как это можно сделать на iOS?
3 ответа
Вы должны обработать загрузку изображения, используя UIImage
который на самом деле не загружает изображение в память, а затем создает растровый контекст с размером нужного вам результирующего изображения (так что это будет объем используемой памяти). Затем вам нужно выполнить итерацию несколько раз для рисования тайлов из исходного изображения (именно здесь части данных изображения загружаются в память), используя CGImageCreateWithImageInRect
в контекст назначения с помощью CGContextDrawImage
,
Посмотрите этот пример кода от Apple.
Большие изображения не помещаются в памяти. Поэтому загрузка их в память для последующего изменения их размера не работает.
Чтобы работать с очень большими изображениями, вы должны выложить их. Например, уже есть множество решений, чтобы понять, может ли это решить вашу проблему:
https://github.com/dhoerl/PhotoScrollerNetwork
Я реализовал свое собственное индивидуальное решение, но оно было специфичным для нашей среды, где у нас уже был сторонник изображений, работающий на стороне сервера, и я мог просто запросить конкретные фрагменты больших изображений (сделано на сервере, это действительно круто)
Причина, по которой работает тайлинг, заключается в том, что в основном вы храните только видимые пиксели в памяти, а их не так много. Все тайлы, которые в данный момент не видны, выводятся в дисковый кеш или во флэш-память.
Взгляните на эту работу Тревора Хармона. Это улучшило производительность моего приложения. Я верю, что оно будет работать и для вас.