Immagine URI di dati più piccola possibile per un'immagine trasparente


125

Sto usando un'immagine 1x1 trasparente con un'immagine di sfondo, per poter usare gli sprite e fornire comunque testo alternativo per alcune icone.

Voglio utilizzare un URI di dati per l'immagine per ridurre il numero di richieste HTTP, ma quale sarebbe la stringa più piccola possibile per produrre un'immagine trasparente ?

Mi rendo conto che potrei usare l'URI dei dati: s per le immagini reali invece degli sprite, ma è più facile da mantenere quando tutto è mantenuto nel CSS invece che sparso.


1
Non sarebbe meglio usare un'immagine 1x1 reale, con la configurazione della cache? Non hai più richieste http e, nel sovraccarico totale dei dati, l'URL dell'immagine potrebbe essere inferiore ai 78 byte dell'URI di dati.
Redzarf

1
@ Redzarf: effettivamente no, probabilmente non sarebbe migliore. risorse piccole e che cambiano raramente influiscono sui tempi di caricamento della pagina non a causa delle dimensioni del file ma a causa del round trip di una richiesta HTTP. Un'altra sottigliezza è che la maggior parte dei browser è molto più aggressiva sulla memorizzazione nella cache dei CSS rispetto ad altre risorse, quindi è meno probabile che il browser sperimenti l'aggiornamento del CSS (e del contenuto quindi incorporato), risparmiando più round trip http.
SingleNegationElimination

Risposte:


167

Dopo aver giocato con diverse GIF trasparenti, alcune sono instabili e causano problemi CSS. Ad esempio, se hai una <img>GIF trasparente e usi la più piccola GIF trasparente possibile, funziona bene, tuttavia, se vuoi che la tua GIF trasparente abbia una background-image, allora questo è impossibile. Per qualche motivo, alcune GIF come le seguenti impediscono gli sfondi CSS (in alcuni browser).

Più breve (ma instabile - 74 byte)

data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==

Consiglierei di utilizzare la versione leggermente più lunga e più stabile come segue:

⇊ Stabile ⇊ (ma leggermente più lungo - 78 byte)

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

Come altro suggerimento, non omettere image/gifcome suggerisce un commento. Ciò si interromperà in diversi browser.


1
+1 grazie! Ho notato che è utile. Ho usato i tuoi dati per creare questo plugin in modo da poter usare immagini di tipo responsive in modo nativo con copertina di sfondo o contenere-> github.com/sebringj/jquery-transparent-gif/blob/master/…
Jason Sebring

1
Perché quello più corto è "instabile"? Vedo che occasionalmente causa un'immagine nera, sono solo curioso di sapere se qualcuno sa perché.
jvenema

Dopo un sacco di problemi, ho effettivamente scoperto che la versione "più breve" stava effettivamente bloccando il browser su alcune (non tutte) pagine del mio sito su browser Android meno recenti (HTC One S, OS 4.1).
WebSeed

Ottima risposta ma non la più piccola possibile finora.
Josh Habdas

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

La lunghezza finale dipende da cosa è compresso con gzip.


3
Ci sono argomenti contro l'utilizzo di un SVG? Ci sono casi in cui non è una buona idea?
tremby

Un SVG va bene per molti casi, ma se combinato con width: auto;, un SVG assumerà la larghezza del suo genitore. Un'immagine statica come GIF o PNG, quando viene assegnata un'altezza e una larghezza fisse automatiche, manterrà le sue proporzioni.
snazzybouche


14

PNG più piccolo - 114 byte:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVQYV2NgYAAAAAMAAWgmWQ0AAAAASUVORK5CYII=

Vale la pena ricordare che questo è facilmente generabile utilizzando GIMP. Il file risultante avrà una dimensione di 68 byte (il più piccolo possibile, finora).
Ismael Miguel

@AminahNuraini questo è un PNG.
joshcarr

2
@AminahNuraini: Che ne dici di questa risposta che ti dice "SVG"?
Gare di leggerezza in orbita l'

10

Questo ragazzo risolve il problema tramite le specifiche GIF. La sua soluzione per il transparent.gifsarebbe 37 byte:

data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==

Va ancora più piccolo rimuovendo prima la trasparenza, poi la tavola dei colori ...


Specifica GIF89a

  • Intestazione (6 byte)

    È costituito dai byte "GIF" e dal numero di versione, che di solito è 89a.

  • Descrittore logico dello schermo (7 byte)

    Senza entrare troppo nei dettagli, questa sezione del file indica quanto segue:

    • Il file ha una dimensione di 1x1 pixel.
    • C'è una tavola dei colori globale.
    • Ci sono 2 colori nella tavola dei colori globale, il secondo dovrebbe essere usato come colore di sfondo.
  • Tabella dei colori globale (6 byte)

    Consiste di 3 byte per colore, un byte per rosso, verde e blu, rispettivamente. Nel nostro file, il primo colore è bianco e il secondo colore è nero.

  • Estensione controllo grafico (8 byte)

    Utilizzato per indicare che il secondo colore nella tavola dei colori deve essere trattato come trasparente (può essere utilizzato anche per i parametri di animazione, ma non è in questo file).

  • Descrittore immagine (10 byte)

    Un file GIF può effettivamente contenere più "immagini" al suo interno, il che evita di dover specificare i dati dell'immagine per parti dell'immagine che hanno lo stesso colore del colore di sfondo. Ogni blocco immagine ha una posizione e una dimensione all'interno della dimensione complessiva dell'immagine. Nel file sopra, la posizione è 0,0 e la dimensione è 1x1.

  • Dati immagine (5 byte)

    Un blocco di dati immagine con codifica LZW . Sono necessari 5 byte per rappresentare il singolo pixel che l'immagine contiene. L'algoritmo di compressione non è stato progettato per comprimere molto bene un singolo byte.

  • Trailer GIF (1 byte)

    Un singolo byte con un valore esadecimale di 3B( ;in ASCII) indica la fine della GIF.

Sulla base delle strutture richieste per una GIF trasparente, risulta che 43 byte sono abbastanza vicini al più piccolo che puoi ottenere.

Ma sono riuscito a trovare un trucco per renderlo un po 'più piccolo. Nello standard è menzionato che è opzionale avere una tavola dei colori globale. Ovviamente non è definito cosa succede quando si crea una GIF senza una tavola dei colori.

Quando hai un indice della tavola dei colori definito come trasparente, tuttavia, ai decoder GIF non sembra importare che non ci sia effettivamente una tavola dei colori.

Quindi ho cambiato il descrittore logico dello schermo per indicare che non c'era una tabella dei colori globale e ho rimosso la tabella stessa, salvando un totale di sei byte, portando la dimensione del file a soli 37 byte.

È interessante notare che Wordpress mi ha fornito un delizioso elenco di messaggi di errore di GD che si lamentano del fatto che questo non è un file GIF valido, nonostante il fatto che Firefox e GIMP aprano e visualizzano (è "visualizzato" quando è trasparente?) Il file va bene.

Per renderlo ancora più piccolo, ho guardato al più grande blocco "opzionale" rimasto nell'immagine, l'estensione del controllo grafico. Se non hai bisogno di trasparenza, questo blocco non è più necessario e sono altri 8 byte che puoi portare via.

Fonte: la GIF più piccola di sempre .


1
Per quell'articolo, la variazione a 37 byte si basa su un comportamento indefinito, e infatti l'autore afferma che il parser di immagini di wordpress non può gestirlo. Anche se probabilmente funzionerà sulla maggior parte dei browser, la considererei una scelta rischiosa. Attaccherei con la variazione di 43 byte da quello stesso articolo. Una variante di questo è già pubblicata sopra . Vedi anche la discussione nei commenti sulla risposta principale
Brian


6

Questo è il più piccolo che ho trovato (26 byte):

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

Questo risulta nero in IE11.
tomasz86

4

Sto usando i seguenti dati uri per ottenere un'immagine vuota: //:0


Firefox 44 e Internet Explorer 11 mostrano il tag alt img. Devi usare uno dei precedenti o rimuovere il tag alt
PersyJack

Questo è più efficiente di una richiesta / risposta per un'immagine?
nu everest

Non convaliderò però
Lucian Davidescu

0

Per un'immagine vuota:

data:null

(si tradurrà in src=(unknown))


In linea di principio mi piace, ma il validatore w3c non approva in pratica: Errore: Dati di valore errati: null per l'attributo src sull'elemento img: Fine prematura dell'URI.
brennanyoung
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.