Який ефект від кодування зображення в base64?


94

Якщо я перетворюю зображення (jpg або png) на base64, то чи буде воно більшим, або матиме однаковий розмір? Наскільки більшим він буде?

Чи рекомендується використовувати кодовані зображення base64 на моєму веб-сайті?


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

Тут є хороша відповідь: stackoverflow.com/questions/1533113/…
Steed

base64 робить глибокі посилання неможливими. Це може бути плюсом.
damoeb

@Wug - Знайте, що це далеко не пізня відповідь, і все змінилося, але, безумовно, це часи, коли ви можете досягти підвищення продуктивності, надіславши bas64. Надсилання повідомлень через веб-сокети із закодованими зображеннями base64 (маленькими) було б більш продуктивним, ніж запит кожного зображення самостійно.
Філіп

Це гарне запитання. Я шукав хорошої відповіді для "зберегти двійкові зображення або закодовані base64?" і я знайшов кілька хороших відповідей, як ця
moreirapontocom

Відповіді:


129

Це буде приблизно на 37% більше:

Дуже приблизно, кінцевий розмір кодованих двійкових даних Base64 дорівнює 1,37 рази від початкового розміру даних

Джерело: http://en.wikipedia.org/wiki/Base64


28
Ні, не на 137% більше, на 137% від початкового розміру :-) На 37% більше (за даними вашого джерела).
Eric J.

4
Я б сказав, що це майже 4/3 від початкового розміру.
kiwixz

Чи існує обмеження щодо розміру зображення для перетворення зображення в base64?
151291

2
@Blender Але в моєму випадку, коли я перетворюю растрове зображення 70 кб на рядок, воно стає 500 кб. Це не 37%. Я стискаю зображення розміром 5 Мб до 70 Кб, а потім перетворюю це стиснене зображення на рядок, який стає 500 Кб.
KJEjava48,

@ KJEjava48: Як ви перетворюєте його на рядок?
Blender

16

Ось справді корисний огляд, коли кодувати base64, а коли ні , Девід Калхун.

Основна відповідь = gzipped закодовані файли base64 за розміром приблизно будуть порівнянні зі стандартними двійковими файлами (jpg / png). Бінарні файли у форматі Gzip матимуть менший розмір.

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


14

Це буде більше в base64.

Base64 використовує 6 бітів на байт для кодування даних, тоді як двійковий файл використовує 8 бітів на байт. Крім того, є невеликі набивки з Base64. Не всі біти використовуються з Base64, оскільки він був розроблений для кодування двійкових даних у системах, які можуть лише правильно обробляти недвійкові дані.

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


7

Кодування зображення до base64 зробить його приблизно на 30% більшим.

Подивіться подробиці у статті wikipedia про схему URI даних , де вказано:

URI кодованих даних Base64 на 1/3 більше, ніж їх двійковий еквівалент. (Однак ці накладні витрати зменшуються до 2-3%, якщо HTTP-сервер стискає відповідь за допомогою gzip)


7

Відповідь така: це залежить.

Хоча зображення base64 більші, є кілька умов, коли base64 є кращим вибором.

Розмір базових 64-зображень

Base64 використовує 64 різних символи, і це 2 ^ 6. Тож base64 зберігає 6 біт на 8 біт символу. Тож пропорція становить 6/8 від неперетворених даних до даних base64. Це не точний розрахунок, а приблизна оцінка.

Приклад:

Зображення 48 кб потребує близько 64 кб як перетворене зображення base64.

Розрахунок: (48/6) * 8 = 64

Простий калькулятор CLI в системах Linux:

$ cat /dev/urandom|head -c 48000|base64|wc -c
64843

Або використовуючи зображення:

$ cat my.png|base64|wc -c

Base64-зображення та веб-сайти

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

  • Багато вбудованих зображень у HTML-файл або CSS-файл можуть мати подібні рядки. Для PNG ви часто зустрічаєте повторювані символи "А". Використовуючи gzip (іноді його називають "здути"), може бути навіть виграш за розміром. Але це залежить від вмісту зображення.
  • Запит на накладні витрати на HTTP1.1: Особливо з великою кількістю файлів cookie ви можете легко отримати кілька кілобайт накладних витрат на запит. Вбудовування зображень base64 може заощадити пропускну здатність.
  • Не кодуйте base64 зображення SVG, оскільки gzip ефективніший на XML, ніж на base64.
  • Програмування: на динамічно генерованих зображеннях легше доставити їх за один запит, ніж скоординувати два залежні запити.
  • Глибокі посилання: якщо ви хочете запобігти завантаженню зображення, трохи складніше витягти зображення зі сторінки HTML.

3

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


Однак це не буде проблемою, коли HTTP 2 справді з’явиться.
Філіп

@Philip Це правда, але мені подобається фактор переносимості, коли всі ресурси містяться у файлі HTML. Це допоможе з кешуванням мобільних веб-сайтів у районах із плямистими мережами.
aalaap

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