Коли використовувати PNG або JPG в розробці iPhone?


98

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

Усі зображення - фотографії чи фотографії тощо.

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

Чи є вказівки, який формат використовувати та в якому випадку?


Я хотів би додати, що оригінальні зображення вже у форматі JPG, якщо це має значення.
Маверик

Відповіді:


140

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

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

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


1
Я ще не бачив будь-яких даних про продуктивність JPEG vs PNG та iPNG. Іноді формат, що стискається більше, стискається за рахунок зменшення необхідного вводу / виводу; Я не впевнений, наскільки швидко працює флешка iPhone. І я точно не можу сказати, що декомпресія PNG вимагає "дуже мало" енергії; Файл Other.artwork представляє собою необроблені дані растрових зображень, імовірно, оскільки накладні витрати процесора / пам'яті на декомпресію PNG занадто великі для часто використовуваних компонентів інтерфейсу.
тс.

2
У моєму поточному проекті у нас дуже великі файли png через вимогу прозорості. IO диска значно переважає час, витрачений на декодування jpeg. Майте на увазі, що PNG також стискаються, лише використовуючи інший алгоритм.
Джон

2
Зрозуміло, я додам ще одну додаткову пораду для тих, хто намагається досягти максимальної продуктивності зображення. Якщо у вас добре стиснуті JPG, ви можете заздалегідь завантажити необроблені дані JPG в об’єкти NSData (можливо, в масив або словник), а також створити JPG, використовуючи UIImage: imageFromData, коли потрібно відобразити. Дані JPG можуть бути на 10-100x меншими, ніж дані растрових зображень, але це дозволяє вам (відносно повільно) частину вводу-виводу вийти з шляху раніше. Очевидно, будьте уважні до того, скільки даних ви кешуєте / попередньо завантажуєте таким чином.
Найджел Флак

2
Я знайшов деякі дані про часи змагань: cocoanetics.com/2012/09/… Схоже, що використання png не швидше jpg;)
Maciej Kozieł

20

Apple оптимізує зображення PNG, які входять у комплект додатків для iPhone. Насправді iPhone використовує спеціальне кодування, в якому кольорові байти оптимізовані для обладнання. XCode обробляє це спеціальне кодування для вас під час створення проекту. Отже, ви бачите додаткові переваги від використання PNG на iPhone, окрім їх розміру. З цієї причини, безумовно, рекомендується використовувати PNG для будь-яких зображень, що з’являються як частина інтерфейсу (у вигляді таблиці, міток тощо).

Що стосується відображення зображення в повноекранному режимі, наприклад, фотографії, ви все одно можете отримати переваги у PNG, оскільки вони не втрачають, а якість візуалу має бути кращою, ніж JPG, не кажучи вже про використання ресурсів при декодуванні зображення. Можливо, вам буде потрібно знизити якість своїх JPG, щоб побачити реальну користь у розмірі файлу, але тоді ви показуєте неоптимальні зображення.

Розмір файлу, безумовно, є фактором, але при виборі формату зображення також є інші міркування.


5
На моєму еталоні Xcode оптимізація фактично зробила файли повільнішими, ймовірно, через те, що вузол вводу / виводу диска, а не процесор - це вузьке місце.
Корнель

1
"Apple оптимізує зображення PNG, які входять у комплект вашого додатка для iPhone" - Чи означає це, що PNG, які динамічно завантажуються, не оптимізовано?
Роберт

1
Ні, PNG, завантажені динамічно, не оптимізовані. В основному оптимізація - це просто заміна байтового порядку з RGBA на BGRA. Це графічний чіп iPhone, який використовується внутрішньо. Більше інформації тут: graphicssoptimization.com/blog/?p=259
Нік Локвуд

11

Є одна важлива річ, про яку слід подумати про PNG. Якщо PNG включений у вашу збірку Xcode, він буде оптимізований для iOS. Це називається розчавленням PNG. Якщо ваш PNG завантажений під час виконання, він не буде роздавлений. Подрібнені PNG працюють приблизно так само, як і 100% JPG. JPG з нижчою якістю працюють краще, ніж більш високі якості. Отже, з точки зору продуктивності від найшвидшого до найповільнішого, JPG низької якості, JPG високої якості, роздробленого PNG, PNG.

Якщо вам потрібно завантажити PNG, слід подумати про подрібнення PNG на сервері перед завантаженням.

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


9

У Cocoanetics блозі опублікував хороший тест продуктивності IOS на JPGs на різних рівнях якості і PNG файлів, і без дроблення.

З його висновку:

Якщо вам абсолютно потрібен альфа-канал або вам потрібно перейти з PNG, тоді доцільно встановити інструмент pngcrush на ваш веб-сервер і дозволити йому обробити всі ваші PNG. Майже у всіх інших випадках високоякісні JPEG поєднують менші розміри файлів (тобто більш швидку передачу) з більш швидким стисненням та рендерінгом.

Виявляється, що PNG чудово підходять для невеликих зображень, які ви використовували б для елементів інтерфейсу, але їх не доцільно використовувати для будь-яких додатків на повний екран, таких як каталоги чи журнали. Там ви хочете вибрати якість стиснення від 60 до 80% залежно від вихідного матеріалу.

З точки зору того, щоб все це відображалося, ви захочете повісити на екземпляри UIImage, з яких ви намалювали один раз, оскільки в них є кешована нестиснена версія файлу. І якщо ви не зробите візуальну паузу, щоб велике зображення з’явилося на екрані, вам доведеться заздалегідь примусити декомпресію для декількох зображень. Але майте на увазі, що для цього буде потрібно велика кількість оперативної пам’яті, і якщо ви перестараєтеся, це може призвести до припинення роботи програми. NSCache - це прекрасне місце для розміщення часто використовуваних зображень, оскільки це автоматично переймається видаленням зображень, коли оперативної пам'яті стає дефіцитною.

Прикро, що у нас немає жодного способу дізнатись, чи потрібно все-таки зображення розпаковувати чи ні. Також зображення, можливо, видалить нестиснену версію, не повідомивши нас про це. Це може бути хорошим радіолокатором, який можна підняти на сайті звітів про помилки Apple. Але, на щастя, доступ до зображення, як показано вище, не потребує часу, якщо зображення вже декомпресується. Тож ви могли просто зробити це не тільки «просто вчасно», але і «про всяк випадок».


Саме так, а JPEGMini та ImageOptim робить jpegs дійсно маленькими!
electronix384128

7

Просто думав, що я поділюсь деякими даними про продуктивність декомпресії ...

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

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

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

Звичайно, кожна ситуація інша, заміни для тестування немає ...


2
GPU не може розпакувати PNG. Формат дефляції, який він використовує, не підходить для типу паралелізації GPU. Я думаю, що декодування JPG може бути частково прискореним графічним процесором, оскільки тут відбувається перетворення кольорового простору.
Корнель

5

Я знайшов значні відмінності в продуктивності анімації при використанні jpegs vs png. Наприклад, розміщення трьох jpegs розміром з екраном поруч з UIScrollView та горизонтальне прокручування iPhone4 призводить до затримки та абсолютно неприємної ривкової анімації. З непрозорими PNG однакових розмірів прокрутка є гладкою. Я ніколи не використовую jpegs, навіть якщо зображення велике.


1

Я думаю, що якщо ви хочете використовувати прозорі, у вас немає іншого вибору, крім PNG. Але якщо ваш фон вже непрозорий, ви можете використовувати JPG. Це єдина різниця, яку я бачу


3
Це не стосується жодних міркувань щодо ефективності JPG та PNG.
daveMac

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.