Imagen de URI de datos más pequeña posible para una imagen transparente

125

Estoy usando una imagen transparente de 1x1 con una imagen de fondo, para poder usar sprites y aún así proporcionar texto alternativo para algunos iconos.

Quiero usar un URI de datos para la imagen para reducir el número de solicitudes HTTP, pero ¿cuál sería la cadena más pequeña posible para producir una imagen transparente ?

Me doy cuenta de que podría usar URI: s de datos para las imágenes reales en lugar de sprites, pero es más fácil de mantener cuando todo se mantiene en el CSS en lugar de dispersarse.

Jacob Rask
fuente
1
¿No sería mejor usar una imagen 1x1 real, con la configuración de almacenamiento en caché? No tiene más solicitudes http y, en la carga total de datos, la URL de la imagen podría ser menor que los 78 bytes de URI de datos.
Redzarf
1
@Redzarf: en realidad, no, probablemente no sería mejor. Los recursos pequeños, que rara vez cambian, afectan los tiempos de carga de la página, no por el tamaño del archivo sino por el viaje de ida y vuelta de una solicitud HTTP. Otra sutileza es que la mayoría de los navegadores son mucho más agresivos sobre el almacenamiento en caché de CSS que otros recursos, por lo que es menos probable que el navegador experimente con CSS refrescante (y el contenido así incrustado), ahorrando más http ida y vuelta.
SingleNegationElimination

Respuestas:

167

Después de jugar con diferentes GIF transparentes, algunos son inestables y causan fallas en CSS. Por ejemplo, si tiene un <img>y usa el GIF transparente más pequeño posible, funciona bien, sin embargo, si quiere que su GIF transparente tenga un background-image, entonces esto es imposible. Por alguna razón, algunos GIF como los siguientes evitan los fondos CSS (en algunos navegadores).

Más corto (pero inestable - 74 bytes)

data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==

Aconsejaría usar la versión un poco más larga y estable de la siguiente manera:

⇊ Estable ⇊ (pero un poco más largo - 78 bytes)

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

Como otro consejo, no omita image/gifcomo sugiere un comentario. Esto se romperá en varios navegadores.

Layke
fuente
1
+1 gracias! Me di cuenta de que esto es útil. Utilicé sus datos para crear este plugin para poder usar imágenes de tipo receptivo de forma nativa con portada de fondo o contener-
Jason Sebring
1
¿Por qué el más corto es "inestable"? Veo que ocasionalmente causa una imagen en negro, solo tengo curiosidad por saber si alguien sabe por qué.
jvenema
Después de mucho dolor, descubrí que la versión "más corta" estaba bloqueando el navegador en algunas (no todas) páginas de mi sitio en navegadores Android más antiguos (HTC One S, OS 4.1).
WebSeed
Gran respuesta pero no la más pequeña posible hasta ahora.
Josh Habdas
22
data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg'/%3E

La longitud final depende de con qué está comprimida.

Adria
fuente
3
¿Hay algún argumento en contra del uso de un SVG? ¿Algún caso en el que no sea una buena idea?
temblorosa
Un SVG está bien para muchos casos, pero cuando se combina con width: auto;un SVG tomará el ancho de su padre. Una imagen estática como GIF o PNG, cuando se le da una altura y ancho automáticos fijos, conservará su relación de aspecto.
snazzybouche
16

Creo que debe ser un archivo GIF transparente comprimido 1x1 (82 bytes):

data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==

Generado con datos de dopiaza.org: generador de URI .

KARASZI István
fuente
14

PNG más pequeño - 114 bytes:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVQYV2NgYAAAAAMAAWgmWQ0AAAAASUVORK5CYII=
joshcarr
fuente
Vale la pena mencionar que esto es fácilmente generable usando GIMP. El archivo resultante tendrá un tamaño de 68 bytes (el más pequeño posible, hasta ahora).
Ismael Miguel
@AminahNuraini este es un PNG.
joshcarr
2
@AminahNuraini: ¿Qué tal esta respuesta te dice "SVG"?
Carreras de ligereza en órbita el
10

Este chico analiza el problema a través de la especificación GIF. Su solución para el transparent.gifsería de 37 bytes:

data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==

Se vuelve aún más pequeño al eliminar primero la transparencia, luego la tabla de colores ...


Especificación GIF89a

  • Encabezado (6 bytes)

    Consiste en los bytes "GIF" y el número de versión, que suele ser 89a.

  • Descriptor de pantalla lógica (7 bytes)

    Sin entrar en demasiados detalles, esta sección del archivo indica lo siguiente:

    • El archivo tiene un tamaño de 1x1 píxeles.
    • Hay una tabla de colores global.
    • Hay 2 colores en la tabla de colores global, el segundo debe usarse como color de fondo.
  • Tabla global de colores (6 bytes)

    Consta de 3 bytes por color, un byte para rojo, verde y azul, respectivamente. En nuestro archivo, el primer color es blanco y el segundo color es negro.

  • Extensión de control gráfico (8 bytes)

    Se usa para indicar que el segundo color en la tabla de colores debe tratarse como transparente (también se puede usar para parámetros de animación, pero no está en este archivo).

  • Descriptor de imagen (10 bytes)

    Un archivo GIF puede contener múltiples "imágenes" dentro de él, lo que evita que tenga que especificar datos de imagen para partes de la imagen que tienen el mismo color que el color de fondo. Cada bloque de imagen tiene una posición y un tamaño dentro del tamaño general de la imagen. En el archivo anterior, la posición es 0,0 y el tamaño es 1x1.

  • Datos de imagen (5 bytes)

    Un bloque de datos de imagen codificado con LZW . Se necesitan 5 bytes para representar el único píxel que tiene la imagen. El algoritmo de compresión no fue diseñado para comprimir un solo byte muy bien.

  • Tráiler GIF (1 byte)

    Un solo byte con un valor hexadecimal de 3B( ;en ASCII) indica el final del GIF.

Basado en las estructuras requeridas para un GIF transparente, resulta que 43 bytes es lo más pequeño posible.

Pero logré encontrar un truco para hacerlo un poco más pequeño. En el estándar se menciona que es opcional tener una tabla de colores global. Por supuesto, no está definido qué sucede cuando haces un GIF sin una tabla de colores.

Sin embargo, cuando tiene un índice de tabla de colores definido como transparente, a los decodificadores GIF no parece importarles que en realidad no haya una tabla de colores.

Así que cambié el descriptor de pantalla lógica para indicar que no había una tabla de colores global y eliminé la tabla misma, ahorrando un total de seis bytes, reduciendo el tamaño del archivo a solo 37 bytes.

Curiosamente, Wordpress me dio una hermosa lista de mensajes de error de GD quejándose de que este no es un archivo GIF válido, a pesar de que Firefox y GIMP abren y muestran (¿se "muestra" cuando es transparente?) muy bien

Para hacerlo aún más pequeño, busqué el bloque "opcional" restante más grande de la imagen, la extensión de control gráfico. Si no necesita transparencia, este bloque ya no es necesario, y esos son otros 8 bytes que puede quitar.

Fuente: El GIF más pequeño de todos .

mckamey
fuente
1
Según ese artículo, la variación de 37 bytes se basa en un comportamiento indefinido y, de hecho, el autor menciona que el analizador de imágenes de WordPress no puede manejarlo. Si bien probablemente funcionará en la mayoría de los navegadores, lo consideraría una opción arriesgada. Me quedaría con la variación de 43 bytes de ese mismo artículo. Una variante de eso ya está publicada arriba . Vea también la discusión en los comentarios sobre la respuesta principal
Brian
6

Este es el más pequeño que encontré (26 bytes):

data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=
KarasQ
fuente
Esto aparece negro en IE11.
tomasz86
4

Estoy usando los siguientes datos uri para obtener una imagen vacía: //:0

Jurgis
fuente
Firefox 44 e Internet Explorer 11 muestran la etiqueta img alt. Tienes que usar uno de los anteriores o eliminar la etiqueta alt
PersyJack
¿Esto es más eficiente que una solicitud / respuesta para una imagen?
nu everest
Sin embargo
Lucian Davidescu el
0

Para imagen vacía:

data:null

(se traducirá a src=(unknown))

T.Todua
fuente
En principio me gusta, pero el validador w3c no lo aprueba en la práctica: Error: Datos de valor incorrecto: nulo para el atributo src en el elemento img: Fin prematuro del URI.
brennanyoung