Методи зміни розміру та якості зображення, які повинен знати кожен розробник iOS

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

розміру

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

Тут я розгляну чотири методи зміни розміру зображень. Всі вони зосереджені на створенні найкращої якості зображення.

Я збираюся порівняти всі зображення зі зміненим розміром із контрольним зображенням. Давайте згенеруємо еталонне зображення з Photoshop (Bicubic). Ми порівняємо зображення графічно, а потім імперічно із середньою помилкою.

UIKit

Зміна розміру UIKit - це найпростіший спосіб зміни розміру і дає хороші результати.

CoreGraphics

За допомогою CoreGraphics якість зображення ідентична зображенню UIKit. По крайней мере, я не міг сприймати жодної різниці, і зображення також не дало різниці. Різниця лише в продуктивності.

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

CoreImage

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

Ось порівняння результатів зміни розміру CoreImage з оригінальним зображенням.

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

vImage

Цей погано задокументований невеликий фреймворк має дуже сильний удар. Результати вражають. Це дає найкращі результати за ідеально чіткого та збалансованого зображення. Менше розмитості порівняно з КГ. Гостріше, ніж КГ. Не такий неприродно різкий, як CI.

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

Продуктивність API чудова. Це можна легко використовувати для всіх операцій із зміни розміру зображення.

Примітка: Я оцінив кольорові показники, порівнюючи їх із оригінальним зображенням, і vImage, здається, є найближчим до зображення оригінального розміру, ніж інші зображення зі зміненим розміром, включаючи версії із розміром Photoshop.

Недолік vImage

Зміна розміру зображення використовує фільтр передискретизації Lanczos5. Ось цитата з офіційної документації щодо яблук

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

Порівняння

Давайте порівняємо всі алгоритми та побачимо середню помилку на зображеннях.

Здається, середня помилка є досить низькою для vImage.