Когда использовать PNG или JPG в разработке iPhone?


У меня есть приложение, которое будет отображать кучу изображений в слайд-шоу. Эти изображения будут частью пакета, таким образом, распространяется с приложением.

все изображения являются фотографиями или фотографическими и т. д.

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

есть ли рекомендации, какой формат использовать и в каком случае?

8 90

8 ответов:

PNG-это идеальный пиксель (без потерь) и требует очень мало дополнительной энергии процессора для отображения. Однако большие png могут занимать больше времени для чтения из хранилища, чем более сжатые форматы изображений, и, следовательно, медленнее отображаться.

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

используйте JPG для фотографий и для чего-либо большого, а PNG для чего-либо маленького и/или предназначенного для отображения "идеального пикселя" (например, небольших значков) или как часть составного прозрачного наложения и т. д.

Apple оптимизирует PNG-изображения, которые включены в ваш пакет приложений для iPhone. На самом деле, iPhone использует специальную кодировку, в которой цветные байты оптимизированы для аппаратного обеспечения. XCode обрабатывает эту специальную кодировку для вас, когда вы строите свой проект. Таким образом, вы видите дополнительные преимущества использования PNG на iPhone, отличные от их размера. По этой причине определенно рекомендуется использовать PNG для любых изображений, которые появляются как часть интерфейса (в табличном представлении, метках и т. д.).

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

размер файла, безусловно, является фактором, но есть и другие соображения в игре, а когда выбор формата изображения.

есть одна важная вещь, чтобы думать о с PNGs. Если PNG включен в вашу сборку Xcode, он будет оптимизирован для iOS. Это называется PNG давка. Если ваш PNG загружается во время выполнения, он не будет раздавлен. Измельченные png работают примерно так же, как и 100% JPGs. Низкого качества в формате JPG работать лучше, чем более высокого качества в формате JPG. Таким образом, с точки зрения производительности от самого быстрого до самого медленного это будет низкокачественный JPG, высококачественный JPG, PNG Crushed, PNG.

Если вам нужно скачать PNGs вы следует рассмотреть возможность дробления png на сервере перед загрузкой.

http://www.cocoanetics.com/2011/10/avoiding-image-decompression-sickness/

The Cocoanetics блог опубликовал хороший тест производительности iOS JPGs на различных уровнях качества, и PNGs, С и без задавливать.

из его заключения:

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

оказывается, что PNGs отлично подходят для небольших изображений, которые вы бы использовали для элементов пользовательского интерфейса, но их нецелесообразно использовать для любого полного экранные приложения, такие как каталоги или журналы. Там вы хотели бы чтобы выбрать качество сжатия от 60 до 80% в зависимости от вашего исходный материал.

с точки зрения получения все это, чтобы отобразить вы хотите, чтобы повесить на UIImage экземпляры, из которых вы оформили потому что у тех есть кэшированная несжатая версия файла в них. И где вы не визуальная пауза для появления большого изображения на экране у вас будет для принудительной декомпрессии на пару изображений заранее. Но потерпи. учтите, что это займет большое количество оперативной памяти и если вы не это может привести к тому, что ваше приложение будет прекращено. NSCache - это a отличное место для размещения часто используемых изображений, потому что это автоматически заботится о выселении изображений когда ОЗУ становится мало.

к сожалению, у нас нет никакого способа узнать, является ли изображение все еще нуждается в распаковке или нет. Также изображение может иметь выселил несжатую версию, не сообщив нам об этом эффект. Это может быть хороший радар, чтобы поднять в сообщении об ошибках Apple сайт. Но, к счастью, доступ к изображению, как показано выше, не занимает много времени если изображение уже распаковано. Так что вы могли бы просто сделать это не только "как раз вовремя", но и "на всякий случай."

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

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

Я загрузил данные изображения в массив NSData, чтобы вывести файл ввода-вывода из уравнения, но создать NSImage на лету. Тестирование при почти максимальной частоте кадров (~25 кадров в секунду) и наблюдая в инструментах я вижу, что приложение явно связано с процессором, и есть примерно 10% увеличение загрузки процессора, показывающее ~275 КБ png против ~75 КБ jpg.

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

конечно каждая ситуация индивидуальна, нет никакой замены для тестирования...

Я нашел огромные различия в производительности анимации при использовании jpegs против png. Например, размещение трех JPEG размером с экран бок о бок в UIScrollView и прокрутка по горизонтали на iPhone4 приводит к задержке и полностью неприятной отрывистой анимации. С non-прозрачных png-изображений тех же габаритов прокрутка гладкая. Я никогда не использую jpeg, даже если изображение большое.

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

"использовать JPEG для фотографий", как указано в Руководство По Человеческому Интерфейсу в разделе произвести работы в соответствующем формате.