Come funziona la compressione delle immagini senza perdita di velocità della pagina di Google?


138

Quando esegui il plug-in PageSpeed ​​di Google per Firebug / Firefox su un sito Web, verranno suggeriti casi in cui un'immagine può essere compressa senza perdita di dati e fornirà un link per scaricare questa immagine più piccola.

Per esempio:

Questo vale per entrambi i tipi di file JPG e PNG (non ho testato GIF o altri.)

Nota anche le miniature di Flickr (tutte quelle immagini sono 75x75 pixel). Sono un risparmio piuttosto grande. Se questo è davvero eccezionale, perché Yahoo non applica questo lato server all'intera libreria e riduce i carichi di archiviazione e larghezza di banda?

Perfino Stackoverflow.com rappresenta alcuni risparmi molto minori:

Ho visto PageSpeed ​​suggerire risparmi abbastanza decenti sui file PNG che ho creato usando la funzione "Salva per Web" di Photoshop.

Quindi la mia domanda è: quali modifiche stanno apportando alle immagini per ridurle di così tanto? Immagino che ci siano risposte diverse per tipi di file diversi. Questo è davvero senza perdite per i JPG? E come possono battere Photoshop? Dovrei essere un po 'sospettoso di questo?


Sembra che Pagespeed stia richiedendo una compressione con perdita. Prima che i risultati dicessero: "La compressione senza perdita di xxx.jpg potrebbe far risparmiare xx kb (riduzione del xx%)". Ora dice "La compressione di xxx.jpg potrebbe salvare xx kb (riduzione del xx%)" È importante sottolineare che Google sembra richiedere di comprimere in perdita solo le immagini più piccole (miniature ecc.). Qualcuno può capire quali strumenti e parametri di compressione con perdita di dati sta utilizzando Google?
Martin,

Risposte:


83

Se sei veramente interessato ai dettagli tecnici, controlla il codice sorgente:


Per i file PNG, usano OptiPNG con un approccio di prova ed errore

// we use these four combinations because different images seem to benefit from
// different parameters and this combination of 4 seems to work best for a large
// set of PNGs from the web.
const PngCompressParams kPngCompressionParams[] = {
  PngCompressParams(PNG_ALL_FILTERS, Z_DEFAULT_STRATEGY),
  PngCompressParams(PNG_ALL_FILTERS, Z_FILTERED),
  PngCompressParams(PNG_FILTER_NONE, Z_DEFAULT_STRATEGY),
  PngCompressParams(PNG_FILTER_NONE, Z_FILTERED)
};

Quando vengono applicate tutte e quattro le combinazioni, viene mantenuto il risultato più piccolo. Semplice come quella.

(NB: lo optipngstrumento da riga di comando lo fa anche se si fornisce -o 2tramite -o 7)


Per i file JPEG, usano jpeglib con le seguenti opzioni:

 JpegCompressionOptions()
     : progressive(false), retain_color_profile(false),
       retain_exif_data(false), lossy(false) {}

Allo stesso modo, WEBP è compresso usando libwebp con queste opzioni:

  WebpConfiguration()
      : lossless(true), quality(100), method(3), target_size(0),
        alpha_compression(0), alpha_filtering(1), alpha_quality(100) {}

C'è anche image_converter.cc che viene utilizzato per convertire senza perdita di dati nel formato più piccolo.


3
In particolare retain_color_profile (false) per JPEG può essere una cattiva idea. Man mano che i display della gamma cromatica estesa diventano più comuni, un'istruzione di resa cromatica chiaramente definita diventa ambigua. Se l'immagine originale è stata codificata in sRGB, funzionerà comunque in alcuni browser (Safari, Firefox con about: config editing) mentre in altri solo le immagini taggate potrebbero essere gestite a colori (Firefox predefinito). Naturalmente i browser senza alcuna capacità di gestione del colore non se ne occuperanno ...
CO

2
Sono stato in esecuzione optipng file.png -o7e non mi sto avvicinando da nessuna parte a ciò che mostra Google. Forse si convertono in SVG quando possibile?
Nateowami,

@Nateowami Ho avuto lo stesso problema ... per alcuni PNG Google fa meglio di optipng -o7. Per questi è possibile scaricare le immagini ottimizzate dal sito Web pageSpeed ​​stesso.
chrisvdb,

46

Uso jpegoptimper ottimizzare i file JPG e optipngper ottimizzare i file PNG.

Se sei attivo bash, il comando per ottimizzare senza perdita di dati tutti i JPG in una directory (ricorsivamente) è:

find /path/to/jpgs/ -type f -name "*.jpg" -exec jpegoptim --strip-all {} \;

È possibile aggiungere -m[%]a jpegoptimimmagini JPG compressi con perdita di dati, ad esempio:

 find /path/to/jpgs/ -type f -name "*.jpg" -exec jpegoptim -m70 --strip-all {} \;

Per ottimizzare tutti i PNG in una directory:

find /path/to/pngs/ -type f -name "*.png" -exec optipng -o2 {} \;

-o2è il livello di ottimizzazione predefinito, puoi cambiarlo da o2a o7. Si noti che un livello di ottimizzazione più elevato significa tempi di elaborazione più lunghi.


29

Dai un'occhiata a http://code.google.com/speed/page-speed/docs/payload.html#CompressImages che descrive alcune delle tecniche / degli strumenti.


1
Grazie per il link Immagino che sto davvero cercando di saperne di più su quali tipi di ridondanze ci sono nei file di immagine che possono essere rimossi se la dimensione del file è la tua preoccupazione principale. So che le informazioni sono là fuori sul web, volevo solo avere un bel posto per raccoglierle qui su SO.
Ha disegnato Noakes il

Uso uno strumento di creazione personalizzato che comprime le immagini sia con optipng che con pngcrush, quindi seleziona il file più piccolo. Tuttavia, Page Speed ​​si lamenta di immagini non ottimali. Quindi quale strumento usano davvero?
user123444555621

@ Pumbaa80 Potresti anche provare advsys.net/ken/util/pngout.htm (che dice specificamente che a volte può ottenere dimensioni più piccole sia di optipng che di pngcrush).
Ambra,

Ho appena scoperto che Page Speed ​​utilizza effettivamente optipng, con un wrapper personalizzato che determina le migliori opzioni di configurazione. @Amber Non è un'opzione, non sto usando Windows;)
user123444555621

15

Si tratta di scambiare il tempo della CPU dell'encoder per l'efficienza di compressione. La compressione è una ricerca di rappresentazioni più brevi e se cerchi di più, troverai quelle più brevi.

Si tratta anche di utilizzare al massimo le funzionalità del formato immagine, ad esempio PNG8 + a anziché PNG24 + a, tabelle Huffman ottimizzate in JPEG, ecc.

Photoshop non si impegna davvero a farlo quando si salvano immagini per il Web, quindi non sorprende che qualsiasi strumento lo batti.

Vedere


L'unica risposta che tenta di rispondere all'effettiva domanda che l'O / P ha effettivamente posto, invece della diversa domanda "come posso comprimere maggiormente le mie immagini"? lol
toddmo,

13

Per replicare i risultati della compressione JPG di PageSpeed ​​in Windows:

Sono stato in grado di ottenere esattamente gli stessi risultati di compressione di PageSpeed ​​usando la versione Windows di jpegtran che puoi trovare su www.jpegclub.org/jpegtran . Ho eseguito l'eseguibile utilizzando il prompt di DOS (utilizzare Start> CMD). Per ottenere esattamente le stesse dimensioni del file (fino al byte) della compressione PageSpeed, ho specificato l'ottimizzazione di Huffman come segue:

jpegtran -optimize source_filename.jpg output_filename.jpg

Per ulteriori informazioni sulle opzioni di compressione, al prompt dei comandi digitare semplicemente: jpegtran

Oppure per utilizzare le immagini generate automaticamente dalla scheda Velocità della pagina in Firebug:

Sono stato in grado di seguire i consigli di Pumbaa80 per ottenere l'accesso ai file ottimizzati di PageSpeed. Eventualmente lo screenshot qui fornisce ulteriore chiarezza per l'ambiente FireFox. (Ma non sono stato in grado di accedere a una versione locale di questi file ottimizzati in Chrome.)

E per ripulire i nomi di file PageSpeed ​​disordinati usando Adobe Bridge ed espressioni regolari:

Sebbene PageSpeed ​​in FireFox sia stato in grado di generare file di immagine ottimizzati per me, ha anche cambiato il loro nome trasformando nomi semplici come:

nice_picture.jpg

in

nice_picture_fff5e6456e6338ee09457ead96ccb696.jpg

Ho scoperto che questa sembra essere una lamentela comune. Dal momento che non volevo rinominare tutte le mie foto a mano, ho usato lo strumento Rinomina di Adobe Bridge insieme a un'espressione regolare. Potresti utilizzare altri comandi / strumenti di rinomina che accettano le espressioni regolari, ma sospetto che Adobe Bridge sia prontamente disponibile per la maggior parte di noi che lavora con problemi di PageSpeed!

  1. Avvia Adobe Bridge
  2. Seleziona tutti i file (usando il controllo A)
  3. Seleziona Strumenti> Rinomina batch (o Control Shift R)
  4. Nel campo Predefinito selezionare "Sostituzione stringa". I campi Nuovi nomi file ora dovrebbero visualizzare "Sostituzione stringa", seguito da "Nome file originale"
  5. Abilita la casella chiamata "Usa espressione regolare"
  6. Nel campo "Trova", inserisci l'espressione regolare (che selezionerà tutti i caratteri a partire dal separatore di sottolineatura più a destra):

    _ (?!. * _) (. *) \. Jpg $

  7. Nel campo "Sostituisci con", inserisci:

    .jpg

  8. Facoltativamente, fai clic sul pulsante Anteprima per visualizzare i risultati della ridenominazione batch proposti, quindi chiudi

  9. Fai clic sul pulsante Rinomina

Dopo l'elaborazione, Bridge deseleziona i file che non sono stati interessati. Se vuoi pulire tutti i tuoi file .png, devi selezionare nuovamente tutte le immagini e modificare la configurazione sopra (per "png" invece di "jpg"). Puoi anche salvare la configurazione sopra come preimpostazione come "Pulisci immagini jpg Page Speed" in modo da poter pulire rapidamente i nomi dei file in futuro.

Schermata di configurazione / Risoluzione dei problemi

Se hai problemi, è possibile che alcuni browser non mostrino correttamente l'espressione RegEx sopra (biasimi i miei caratteri di escape), quindi per uno screenshot della configurazione (insieme a queste istruzioni), vedi:

Come utilizzare lo strumento Rinomina batch di Adobe Bridge per ripulire le immagini PageSpeed ​​ottimizzate con nomi di file disordinati


Grazie per averlo condiviso!
rotaercz,

1
Se si utilizza IIS, PageSpeed ​​è stato recentemente portato su Windows ed esegue automaticamente le stesse ottimizzazioni. iispeed.com Per la migliore riduzione, anche se senza alcuna perdita, ho convertito in blocco intere directory di JPEG usando JPEGmini jpegmini.com
James Moberg

Sembra che non ci sia più PageSpeed ​​Extension per Firebug.
Stephan Schielke,

10

Secondo me l'opzione migliore là fuori che gestisce efficacemente la maggior parte dei formati di immagine in un colpo solo è il trimage . Utilizza efficacemente optipng, pngcrush, advpng e jpegoptim in base al formato dell'immagine e offre una compressione quasi perfetta senza perdita.

L'implementazione è piuttosto semplice se si utilizza una riga di comando.

sudo apt-get install trimage    
trimage -d images/*

e voilà! :-)
Inoltre troverai un'interfaccia abbastanza semplice per farlo anche manualmente.


2
Qualche alternativa per Windows?
Mathias Lykkegaard Lorenzen,

2

C'è uno script batch molto utile che ottimizza ricorsivamente le immagini sotto una cartella usando OptiPNG (da questo blog ):

FOR /F "tokens=*" %G IN ('dir /s /b *.png') DO optipng -nc -nb -o7 -full %G

UNA LINEA!


1
FOR /F "tokens=*" %G IN ('dir /s /b *.png') DO optipng -nc -nb -o7 -full "%G" se hai spazi nel nome del tuo file
Ned Martin,

0

Se stai cercando l'elaborazione batch, tieni presente i reclami di trimage se non hai Xserver a disposizione. In tal caso basta scrivere uno script bash o php per fare qualcosa del genere

<?php
    echo "Processing jpegs<br />";
    exec("find /home/example/public_html/images/ -type f -name '*.jpg' -exec jpegoptim --strip-all {} \;");
    echo "Processing pngs<br />";
    exec("find /home/example/public_html/images/ -type f -name '*.png' -exec optipng -o7 {} \;");
?>

Modifica le opzioni in base alle tue esigenze.


0

Per Windows ci sono diverse interfacce drag'n'drop per un facile accesso.

https://sourceforge.net/projects/nikkhokkho/files/FileOptimizer/

Per i file PNG ho trovato questo per il mio divertimento, apparentemente 3 diversi strumenti racchiusi in questo GIU. Basta trascinare e rilasciare e lo fa per te.

https://pnggauntlet.com/

Tuttavia, ci vuole tempo, prova a comprimere un file png da 1 MB: sono rimasto sorpreso dalla quantità di CPU impiegata in questo confronto di compressione, che deve essere quello che sta succedendo qui. Sembra che l'immagine sia compressa in 100 modi e vince il migliore: D

Per quanto riguarda la compressione JPG, mi sento rischioso per la striscia di profili di colore e tutte le informazioni extra - tuttavia - se tutti lo fanno - è lo standard aziendale, quindi l'ho fatto da solo: D

Oggi ho salvato 113 MB su 5500 file su un'installazione WP, quindi ne vale la pena!

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.