Изменение размера UIImage на iPhone с небольшим объемом памяти - PullRequest
8 голосов
/ 02 августа 2010

Я видел этот вопрос, задаваемый десятки раз, но никогда не отвечал.

Как вы изменяете размер UIImage (в частности, один, возвращенный с камеры UIImagePickerController).Когда я пробую любой из существующих методов, я получаю скачок памяти между 20 и 40 МБ.Это проходит, но я знаю, что на некоторых аппаратных средствах это совершенно неприемлемо.

Я пробовал методы, которые используют следующие операции: drawInRect :, CGContextDrawImage (), imageWithCGImage: scale: direction:

Я понимаю, что несжатые изображения, хранящиеся в памяти, занимают больше места, чем на диске, но кажется, что наиболее распространенные операции изменения размера UIImage включают создание копий данных изображения.

Даже Apple рекомендует немедленно изменить размер изображенияснято с камеры.Однако (я думаю, они знают, что эта тема чрезвычайно сложна), они не дают слов руководства о том, как с этим справиться.Особенно, как это сделать в тот момент, когда возвращаются данные изображения.

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

Ответы [ 5 ]

1 голос
/ 21 июня 2011

Вот пара git-проектов, которые охватывают изменение размера UIImage. Я использую второй, и он работает как шарм. В него включен хороший пример проекта, так что вы можете точно увидеть, как его использовать. Я думаю, что у первого также есть образец, хотя я не пробовал использовать его или присматривался.

https://github.com/coryalder/UIImage_Resize

https://github.com/AliSoftware/UIImage-Resize

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

1 голос
/ 02 августа 2010

Метод, который использует мало памяти, заключается в создании растрового контекста с CGBitmapContextCreate и рисовании UIImage в нем. Единственная дополнительная память, которую он будет использовать - это то, что вы malloc редактировали, и небольшие CGContext накладные расходы.

Если вы хотите получить фантазию, вместо этого вы можете mmap с установленным флагом PROT_WRITE и ограничиваться только виртуальным адресным пространством

1 голос
/ 20 сентября 2010

Пробовали ли вы сравнительный анализ объема памяти, используемого при изменении размера UIImage с помощью методов категорий, описанных в следующем блоге post .

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

Надеюсь, это поможет.

0 голосов
/ 16 декабря 2010

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

0 голосов
/ 02 августа 2010

У меня нет 100% отличного ответа, но у вас есть пара вариантов.Iphone позволит вам войти в режим редактирования / обрезки и т. Д.Я думаю, это то, что Apple хочет, чтобы вы использовали.Для нас это было не совсем приемлемо.Мы берем данные изображения, получаем данные пикселей, выпускаем исходное изображение.Затем измените размер верхней половины, а затем - второй.Я бы опубликовал код, но я не на работе.Я могу через несколько дней после отпуска ...

...