Изменение размера UIImage на iPhone с небольшим объемом памяти

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

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

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

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

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

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


person sambecker    schedule 01.08.2010    source источник
comment
Еще мысли? Я могу отправить это в Apple.   -  person sambecker    schedule 03.08.2010


Ответы (5)


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

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

person rpetrich    schedule 02.08.2010
comment
Я попробовал этот метод, но не смог сохранить память. Есть ли конкретный шаблон сохранения / освобождения, который начинается и заканчивается UIImage, которым вы можете поделиться? - person sambecker; 02.08.2010
comment
У меня нет примеров кода, потому что я просто использую гораздо более простой частный API в своих приложениях для взлома. Приведенный выше код предоставит вам изображение, размер которого будет изменен на выбранный вами буфер. Чтобы создать UIImage из этого, объедините следующие API: CGDataProviderCreateWithData, CGImageCreate и -[UIImage initWithCGImage:]. Обязательно следуйте правильным шаблонам управления памятью и укажите правильный обратный вызов для вашего CGDataProvider. - person rpetrich; 04.08.2010

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

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

Надеюсь, это каким-то образом поможет.

person petert    schedule 20.09.2010

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

https://github.com/coryalder/UIImage_Resize

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

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

person jinglesthula    schedule 21.06.2011

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

person David Nelson    schedule 02.08.2010
comment
В зависимости от того, как вы получаете данные пикселей, это может привести к ненужной копии (один раз внутри UIImage и снова в ваш буфер) - person rpetrich; 02.08.2010

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

person Henrik Erlandsson    schedule 16.12.2010