Uszczuplanie plików JPEG na małą skalę
Napisał: Patryk Krawaczyński
20/10/2012 w Administracja Brak komentarzy. (artykuł nr 377, ilość słów: 321)
N
a jednym z serwerów X pełniącym rolę WWW w katalogu Y znajduje się blisko 150.000 różnych plików graficznych typu dżej-peg. Ich średnia* wielkość wynosi 26.56 KB. W dwóch próbach zostały one poddane działaniu programu jpegtran z następującymi parametrami:
#!/bin/sh JPEGS=`ls | grep jpg` for j in $JPEGS do jpegtran -copy none -optimize -progressive -perfect $j > $j".tmp" if [ $? = 0 ]; then mv -f $j".tmp" $j else rm $j".tmp" fi done
Pierwsza próba obejmowała 80.266 plików o łącznej zajętości 2479,77 MB. Po przejściu programu jpegtran
zajmowane przez nie miejsce na dysku spadło do 2332,29 MB, czyli zwolnione zostało 147,48 MB. Druga próba obejmowała 69.726 plików, które zostały dodane jakiś czas po pierwszej próbie. Ich łączy rozmiar wynosił 1731,95 MB. Po przejściu programu jpegtran
zajmowane przez nie miejsce na dysku spadło do 1597,6 MB, czyli zwolnione zostało 134,35 MB.
Zabieg ten głównie miał na celu usunięcie zbędnych informacji z plików graficznych (-copy none
), zastosowanie progresywnej kompresji (-progressive
) umożliwiającej wyświetlanie grafik od początku ich pobierania w postaci warstw oraz optymalizację (-optimize
), która w niektórych przypadkach może bezstratnie zredukować wielkość pliku JPG nawet do 50%.
* w celu obliczenia średniej wielkości wszystkich plików został wykorzystany skrypt:
#!/bin/sh NUMFILES=$(find . -maxdepth 1 -type f | wc -l) TOTAL=$((0)) for EACH in $(find . -maxdepth 1 -type f | ls -la | awk '{print $5}'); do TOTAL=$((TOTAL+EACH)) done AVERAGE=$(echo "scale = 2; $TOTAL / $NUMFILES / 1024" | bc -l) echo "Average file size: $AVERAGE KB."
Warto wspomnieć, że na próbkę liczącą 149992 plików, żaden z nich nie został w jakikolwiek sposób uszkodzony, czy zniekształcony (prawie co trzeci plik pochodził z innego źródła / użytkownika).
Więcej informacji: JPEGclub