Для прозорого зображення можливе найменше зображення URI даних


125

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

Я хочу використовувати URI даних для зображення, щоб зменшити кількість запитів HTTP, але яка б була найменша можлива рядок для створення прозорого зображення ?

Я усвідомлюю, що міг би використовувати URI: s для фактичних зображень замість спрайтів, але простіше підтримувати, коли все зберігається в CSS, а не розкидано навколо.


1
Хіба не було б краще використовувати фактичне зображення 1х1 із налаштуванням кешування? У вас немає більше запитів http, і загалом накладні дані, URL-адреса для зображення може бути меншою, ніж 78 байт URI даних.
Редзарф

1
@Redzarf: насправді, ні, мабуть, не було б краще. невеликі, рідко змінювані ресурси впливають на час завантаження сторінки не через розмір файлу, а через зворотну подорож HTTP-запиту. Ще одна тонкість полягає в тому, що більшість веб-переглядачів набагато агресивніше щодо кешування CSS, ніж інші ресурси, тому браузер менше шансів експериментувати з оновленням css (та вмістом, вбудованим таким чином), економлячи більше http туристів.
SingleNegationElimination

Відповіді:


167

Після гри з різними прозорими GIF, деякі з них нестабільні і викликають збої у CSS. Наприклад, якщо у вас є <img>і ви використовуєте найдрібніший прозорий GIF, він працює чудово, однак, якщо ви хочете, щоб ваш прозорий GIF мав такий background-image, це неможливо. Чомусь деякі GIF-файли, як-от наведені нижче, запобігають фонові зображення CSS (у деяких браузерах).

Коротше (але нестабільно - 74 байти)

data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==

Я б радив використовувати трохи довший і стабільніший варіант наступним чином:

Стабільний ⇊ (але трохи довше - 78 байт)

data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7

Як ще одна порада, не пропускайте, image/gifяк підказує один коментар. Це порушиться в декількох браузерах.


1
+1 спасибі! Я помітив, що це стане в нагоді. Я використовував ваші дані для створення цього плагіна, щоб я міг використовувати зображення, що реагують на вбудованому режимі, із фоновою обкладинкою або містити-
Jason Sebring

1
Чому коротший "нестабільний"? Я бачу, що це час від часу викликає чорний образ, мені просто цікаво, якщо хтось знає, чому.
jvenema

Після сильного болю я фактично виявив, що "коротша" версія насправді вибиває браузер на деяких (не всіх) сторінках мого сайту на старих браузерах Android (HTC One S, OS 4.1).
WebSeed

Чудова відповідь, але не найменша можлива поки що.
Джош Хабдас

22
data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg'/%3E

Кінцева довжина залежить від того, з чим це gzipped.


3
Чи є якісь аргументи проти використання SVG? Бувають випадки, коли це не дуже гарна ідея?
тремтіння

SVG добре підходить для багатьох випадків, але в поєднанні з width: auto;SVG буде приймати ширину свого батьківського. Статичне зображення, таке як GIF або PNG, коли задається автоматичною висотою та шириною, збереже своє співвідношення сторін.
snazzybouche


14

Найменший PNG - 114 байт:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVQYV2NgYAAAAAMAAWgmWQ0AAAAASUVORK5CYII=

Варто зазначити, що це легко породжувати за допомогою GIMP. Отриманий файл матиме розмір 68 байт (найменший можливий поки що).
Ісмаїл Мігель

@AminahNuraini це PNG.
joshcarr

2
@AminahNuraini: Що про цю відповідь каже вам "SVG"?
Гонки легкості на орбіті

10

Цей хлопець вирішує проблему через специфікацію GIF. Його рішення для рівня transparent.gifбуде 37 байт:

data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==

Він стає ще меншим, спочатку знімаючи прозорість, потім таблицю кольорів ...


Специфікація GIF89a

  • Заголовок (6 байт)

    Складається з байтів "GIF" та номера версії, яка зазвичай є 89a.

  • Логічний дескриптор екрана (7 байт)

    Не надто детально розглядаючи цей розділ файлу, вказується на наступне:

    • Файл розміром 1х1 пікселів.
    • Існує глобальна таблиця кольорів.
    • У глобальній таблиці кольорів є 2 кольори, другий слід використовувати як колір фону.
  • Глобальна кольорова таблиця (6 байт)

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

  • Розширення для графічного управління (8 байт)

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

  • Дескриптор зображень (10 байт)

    Файл GIF насправді може містити декілька «зображень» всередині нього, що не дозволяє вказувати дані зображення для частин зображення, які мають той же колір, що і колір тла. Кожен блок зображень має положення та розмір у межах загального розміру зображення. У наведеному вище файлі позиція дорівнює 0,0, а розмір - 1х1.

  • Дані зображення (5 байт)

    Один блок зображень, кодований LZW . Потрібно 5 байт, щоб представити один піксель, який має зображення в ньому. Алгоритм стиснення не був розроблений для того, щоб дуже добре стискати один байт.

  • GIF-трейлер (1 байт)

    Один байт зі шістнадцятковим значенням 3B( ;в ASCII) вказує на кінець GIF.

Виходячи з необхідних структур для прозорого GIF, виявляється, що 43 байти досить близькі до мінімальних розмірів.

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

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

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

Цікаво, що Wordpress подав мені прекрасний список повідомлень про помилки GD, поскаржившись, що це не дійсний файл GIF, незважаючи на те, що Firefox та GIMP відкриваються та відображаються (чи "відображається", коли він прозорий?) Файл просто добре.

Щоб зробити його ще меншим, я подивився на найбільший “необов’язковий” блок на зображенні, розширення графічного керування. Якщо вам не потрібна прозорість, цей блок більше не потрібен, і це ще 8 байт, які ви можете забрати.

Джерело: The Tinyest GIF Ever .


1
Згідно з цією статтею, варіація в 37 байт покладається на невизначене поведінку, і насправді автор зазначає, що аналізатор зображень Wordpress не може впоратися з цим. Хоча це, ймовірно, працюватиме в більшості браузерів, я вважаю це ризикованим вибором. Я б дотримувався 43-байтного варіанту цієї ж статті. Варіант цього вже розміщений вище . Дивіться також обговорення в коментарях до головної відповіді
Брайан

9

Ви можете спробувати наступні дані SVG (60 байт):

data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg"/>

Окремий файл SVG виглядатиме так (62 байти):

<?xml version="1.0"?><svg xmlns="http://www.w3.org/2000/svg"/>

Дивитися також:


2
Може також бути закодовані і використовуються в Favicon або CSS contentвластивості.
Джош Хабдас

6

Це найменший я знайшов (26 байт):

data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=

Це з'являється чорним кольором в IE11.
tomasz86

4

Я використовую такі дані uri, щоб отримати порожнє зображення: //:0


Firefox 44 та Internet Explorer 11 показують тег img alt. Вам або доведеться скористатися одним із перерахованих вище або видалити тег alt
PersyJack

Це ефективніше, ніж запит / відповідь для зображення?
nu everest

Чи не перевіряти , хоча
Люциан Давідеску

0

Для порожнього зображення:

data:null

(це переведеться на src=(unknown))


Мені це в принципі подобається, але w3c валідатор на практиці не схвалює: Помилка: Неправильні дані про значення: null для атрибуту src для img елемента: Передчасний кінець URI.
brennanyoung
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.