jpg или png для UIImage — что эффективнее?
-
03-07-2019 - |
Вопрос
Я беру изображение из фотопленки, затем некоторое время использую его, а также сохраняю на диск в формате PNG на iPhone.У меня происходит странный сбой, предположительно из-за нехватки памяти.
Имеет ли значение, сохраню ли я его в формате PNG или JPG (при условии, что я выберу примечание для снижения качества в случае JPG)?Конкретно:
- больше памяти используется UIImage после перезагрузки его с диска, если я сохранил его как PNG?
- Возможно ли сохранение, поскольку PNG во время процесса сохранения временно использует больше памяти?
Я предполагал, что UIImage является представлением, нейтральным к формату, и это не должно иметь значения, но решил, что мне следует проверить.
Решение
У меня есть приложение в магазине, которому необходимо сохранять промежуточные версии изображения во время его редактирования.В исходной версии я использовал для сохранения формат PNG, чтобы избежать потери качества при многократной загрузке и сохранении JPEG.
Примерно в выпуске программного обеспечения 2.2 Apple внесла изменения в код записи PNG, так что сохранение данных PNG из некоторых изображений занимает во много раз больше времени.В итоге мне пришлось перейти на сохранение в формате JPEG, поскольку время ожидания моего приложения истекло при попытке сохранить изображения при выходе.
Кроме того, вы столкнетесь с проблемами, поскольку сохранение в формате PNG не сохраняет информацию об ориентации в UIImage, поэтому изображение, сделанное в портретной ориентации встроенной камерой, будет отображаться повернутым после сохранения и перезагрузки.
Другие советы
У меня происходит странный сбой, предположительно из-за нехватки памяти.
Затем ОСТАНОВИТЕ ТО, ЧТО ВЫ ДЕЛАЕТЕ ПРЯМО СЕЙЧАС и сначала выясните, действительно ли это является причиной сбоя.В противном случае очень велика вероятность того, что вы преследуете не ту проблему, исправляя несуществующую проблему с памятью, игнорируя при этом реальную причину сбоя.Если вы хотите исправить сбой, начни с выяснения причины аварии.Поиск «предположительно» проблемы — это путь к напрасной трате времени и усилий.
Это зависит от того, с каким типом изображений вы имеете дело.Если вы имеете дело с фотографическими изображениями, файлы JPEG почти всегда будут меньше, чем PNG, без заметной потери деталей, которую можно увидеть человеческим глазом.
И наоборот, если вы имеете дело с нефотографическими изображениями, такими как элементы графического пользовательского интерфейса или изображения с большими блоками сплошных цветов, то PNG и JPEG будут сопоставимы по размеру, но PNG сохранится без потерь, тогда как JPEG будет с потерями и очень заметные артефакты.Если у тебя есть Действительно простое изображение (например, очень большие блоки постоянных цветов), то PNG, скорее всего, будет намного меньше, чем JPEG, и снова не будет иметь никаких артефактов сжатия.
Сохранение изображения в формате PNG или JPEG не должно занимать много временной памяти.Когда изображение находится в памяти, оно обычно хранится в памяти в несжатом виде, поэтому его можно очень быстро отобразить на экране, вместо того, чтобы распаковывать его каждый раз, когда вы хотите его отобразить.По сравнению с размером несжатого изображения объем дополнительной временной памяти, необходимой для его сжатия, очень мал.Если вы можете разместить несжатое изображение в памяти, вам не придется беспокоиться о памяти, используемой при его сжатии.
И, конечно же, как только вы запишите образ в файловую систему в энергонезависимом хранилище и освободите образ в памяти, на самом деле не имеет значения, насколько велик сжатый образ, поскольку он больше не занимает основную память. .Размер сжатого изображения влияет только на то, сколько флэш-памяти оно использует, что может быть проблемой, но не влияет на высокую вероятность того, что вашему приложению не хватает памяти.
Сбои могут быть вызваны известной утечкой памяти в UIImagePickerController.
У меня нет точных данных, но я предполагаю, что PNG предпочтительнее, потому что Apple, похоже, использует PNG практически везде в iPhone OS.
Однако, если у вас уже есть код для записи PNG, не составит труда изменить его для записи в формате JPEG, не так ли?Просто попробуйте оба метода и посмотрите, какой работает лучше.
Используйте PNG везде, где это возможно.В рамках компиляции XCode запускает все файлы PNG с помощью утилиты (pngcrush), чтобы сжать и оптимизировать их.
- Является ли больше памяти, а затем используется UIImage после того, как я перезагружаю его на диск, если я сохранил его как PNG?=> Нет, объем памяти будет одинаковым, если вы импортируете два изображения с одинаковым разрешением и одинаковым количеством каналов.(например, RGBA)
- Возможно ли сохранение, поскольку PNG во время процесса сохранения временно использует больше памяти?=> Нет, это влияет только на вашу дисковую память.