JPG или PNG для UIImage - что является более эффективным? - PullRequest
9 голосов
/ 29 апреля 2009

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

Имеет ли значение, если я сохраню его в формате PNG или JPG (при условии, что я выберу примечание, чтобы снизить качество в случае JPG)? В частности:

  • больше памяти, чем используется UIImage после того, как я перезагрузил его с диска, если я сохранил его как PNG?
  • Возможно ли сохранение, так как PNG временно использует больше памяти во время процесса сохранения?

Я предполагал, что UIImage является нейтральным по формату представлением, и это не должно иметь значения, но я подумал, что должен проверить.

Ответы [ 7 ]

25 голосов
/ 29 апреля 2009

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


Затем ОСТАНОВИТЕ, ЧТО ВЫ ДЕЛАЕТЕ ПРЯМО СЕЙЧАС и сначала выясните, действительно ли это является причиной аварии. В противном случае есть очень хороший шанс, что вы будете преследовать не ту проблему здесь, исправляя проблему с памятью, которая не существует, игнорируя реальную причину сбоя. Если вы хотите исправить сбой, начните с выяснения причины его сбоя . Отслеживание того, что, «предположительно», является проблемой, - это трата времени и усилий.

10 голосов
/ 29 апреля 2009

У меня есть приложение в магазине, которое должно сохранять промежуточные версии изображения по мере его редактирования. В исходной версии я использовал формат PNG для сохранения, чтобы избежать потери качества при загрузке и сохранении JPEG несколько раз.

Когда-то около выпуска программного обеспечения 2.2 Apple внесла изменения в код записи PNG, так что для сохранения данных PNG из некоторых изображений требуется много раз больше времени. В итоге мне пришлось перейти на сохранение в формате JPEG, потому что мое приложение истекло при попытке сохранить изображения при выходе.

Кроме того, у вас возникнут проблемы, поскольку сохранение в формате PNG не сохраняет информацию об «ориентации» в UIImage, поэтому после сохранения и перезагрузки снимок, сделанный в книжной ориентации со встроенной камерой, будет вращаться. это.

5 голосов
/ 29 апреля 2009

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

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

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

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

1 голос
/ 26 июня 2009

Ваш сбой может быть вызван известной утечкой памяти в UIImagePickerController.

Это должно помочь вам исправить это.

0 голосов
/ 20 сентября 2013
  1. больше памяти, чем используется UIImage после перезагрузки диск, если я сохранил его как PNG? => Нет, это тот же самый объем памяти, если вы импортируете из 2 изображений с одинаковым разрешением и одинаковым количеством каналов. (например, RGBA)
  2. Возможен ли акт сохранения, поскольку PNG временно использует больше памяти во время процесса сохранения? => Нет, это влияет только на вашу дисковую память.
0 голосов
/ 29 апреля 2009

Используйте PNG везде, где это возможно. В рамках компиляции XCode запускает все файлы PNG через утилиту (pngcrush) для сжатия и оптимизации.

0 голосов
/ 29 апреля 2009

У меня нет точных данных, но я предполагаю, что PNG предпочтительнее, потому что Apple, кажется, использует PNG практически везде в iPhone OS.

Однако, если у вас уже есть код, настроенный для написания PNG, не должно быть слишком сложно изменить его для написания JPEG, не так ли? Просто попробуйте оба метода и посмотрите, какой из них работает лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...