2013-04-16 11 views
11

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

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

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

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

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

+0

Вы можете использовать NSData * data = [NSData dataWithContentsOfFile: параметры пути: NSDataReadingMappedAlways error: & error]; Чтобы получить доступ к данным изображения, не загружая их в память. – Sten

+0

спасибо за отзыв Sten, я пробовал использовать параметр NSDataReadingMappedAlways, но он по-прежнему падает с 10000 * 10000 изображений, я думаю, что независимо от того, как загрузить изображение, использовать UIGraphicsBeginImageContext для масштабирования исходного изображения требуется весь растровый файл в памяти. Есть ли способ уменьшить размер изображения при загрузке файла jpeg/png в память? – lingtianlan

ответ

8

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

См. this sample code from Apple.

+0

Отлично, он не может стать более авторитетным, чем пример кода от Apple, который касается именно этой темы! – DarkDust

0

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

https://github.com/coryalder/UIImage_Resize

+0

Поскольку это работает с уже включенным в память UIImage, как избежать проблем с памятью? – DarkDust

1

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

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

https://github.com/dhoerl/PhotoScrollerNetwork

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

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