Test tworzenia miniatur w PIL, Epeg i ImageMagick
31 July 2008
Comments
Szybkie tworzenie miniatur z plików graficznych - w szczególności zdjęć z aparatów cyfrowych, to jeden z ważniejszych elementów internetowych galerii, czy też desktopowych aplikacji do organizowania grafik. Bibliotek służących do tworzenia miniatur (ogólnie do obróbki grafiki) jest co najmniej kilka:
Ale są też mniejsze biblioteki służące tylko i wyłącznie do skalowania grafik. Taką biblioteką jest Epeg - biblioteka bazująca na libjpeg i wchodząca w skład rozwojowej wersji środowiska graficznego Enlightment (E17). Która biblioteka jest najszybsza, która tworzy miniatury o dobrej jakości i niedużym rozmiarze pliku?
Epeg
Bibliotekę epeg pod Linuksem znajdziemy w repozytorium zawierającym pakiety e17. Możemy także pobrać najnowszy kod źródłowy i skompilować samodzielnie (wymaga wyłącznie libjpeg). Po kompilacji i instalacji powinna być dostępna konsolowa aplikacja "epeg". Do testów wykorzystałem nieco zmodyfikowaną wersję o kodzie:#include <stdlib.h>
#include <unistd.h>
#include <Epeg.h>
#define PROGRAM "ethumber"
int
main(int argc, char **argv)
{
Epeg_Image * image;
int ch, height, quality, width;
char *input, *output;
/* Default values - can be overidden */
quality = 80;
height = 125;
width = 125;
output = "thumb.jpg";
while ((ch = getopt(argc, argv, "h:i:o:q:w:")) != -1) {
switch (ch) {
case 'h':
height = atoi(optarg);
break;
case 'i':
input = optarg;
break;
case 'o':
output = optarg;
break;
case 'q':
quality = atoi(optarg);
break;
case 'w':
width = atoi(optarg);
break;
default:
exit (0);
}
}
image = epeg_file_open(input);
if (!image) {
exit (0);
}
epeg_decode_size_set(image, width, height);
epeg_quality_set (image, quality);
epeg_file_output_set(image, output);
epeg_encode(image);
epeg_close(image);
return 0;
}
gcc nazwa_pliku.c -o epeg `epeg-config --cflags --libs`
Ze skompilowanego "epeg" korzystamy podobnie jak z oryginalnej wersji:
./epeg -i ORYGINAŁ.jpg -o MINIATURA.jpg -h WYSOKOŚC -w DŁUGOŚĆ -q JAKOŚĆ
PIL
Biblioteka do obróbki grafiki pod Pythonem. Do testów wykorzystałem prosty skrypt tworzący miniaturę z wykorzystaniem wyostrzenia (SHARPEN).from sys import argv
import Image
import ImageFilter
quality = 80
width = 125
heigth = 125
source = False
thumb = False
sharp = False
if '-q' in argv:
quality = int(argv[argv.index('-q')+1])
if '-h' in argv:
heigth = int(argv[argv.index('-h')+1])
if '-w' in argv:
width = int(argv[argv.index('-w')+1])
if '-i' in argv:
source = argv[argv.index('-i')+1]
if '-o' in argv:
thumb = argv[argv.index('-o')+1]
if '-s' in argv:
sharp = True
if source and thumb:
im = Image.open(source)
im.thumbnail((width, heigth), Image.ANTIALIAS)
if sharp:
im.filter(ImageFilter.SHARPEN)
im.save(thumb, "JPEG",quality=quality)
Test
- Badany był czas (bash/time) potrzebny do stworzenia miniatur z 20 grafik o dużej rozdzielczości (tapety, zdjęcia cyfrowe) - 42,5 MB.
- Biblioteki były wywoływane przez skrypty Basha przekazujące po kolei wszystkie grafiki. Dla imagemagick:
for plik in sources/* do convert $plik -thumbnail 250x187 -quality 80 thumbs/ithum$plik done
- Wszystkie biblioteki miały za zadanie stworzyć miniatury jpg o tym samych rozmiarach i jakości 80%.
- Epeg - 2,4 s
- PIL - 4,7 s
- ImageMagick - 15,9 s

Opis | Epeg | PIL | ImageMagick |
---|---|---|---|
Duża grafika 1,3 MB, 2560x1600 |
![]() 8,5kB |
![]() 8,1kB |
![]() 10,1kB |
Mała grafika 27 kB, 300x506 |
![]() 8,5kB |
![]() 8,5kB |
![]() 8,3kB |
RkBlog
Comment article