RkBlog

Hardware, programming and astronomy tutorials and reviews.

Test tworzenia miniatur w PIL, Epeg i ImageMagick

Porównanie jakości i czasu generowania miniatur z plików jpg dla bibliotek: epeg, pil i imagemagick.

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;
}
Który można skompilować poleceniem:
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

Najszybsza okazała się biblioteka Epeg, nieco wolniejszy był PIL, a ImageMagick okazał się najwolniejszy (Aktualizacja: w przypadku ImageMagick należy podać również parametr -size, co zapobiega wczytywaniu całych plików i znacząco przyśpiesza działanie aplikacji). Niestety Epeg nie zachowuje proporcji przy skalowaniu obrazków.
szybkość miniaturowania epeg, pil i imagemagick
Opis Epeg PIL ImageMagick
Duża grafika
1,3 MB, 2560x1600
miniatura zrobiona przez epeg
8,5kB
miniatura zrobiona przez PIL
8,1kB
miniatura zrobiona przez ImageMagick
10,1kB
Mała grafika
27 kB, 300x506
miniatura zrobiona przez epeg
8,5kB
miniatura zrobiona przez PIL
8,5kB
miniatura zrobiona przez ImageMagick
8,3kB
Epeg okazał się najszybszy, lecz w przypadku dużych grafik widoczne są zniekształcenia (brak filtrów anti-alias). Dla grafik o dużej ilości szczegółów brak wyostrzania też może dać się we znaki. PIL oraz ImageMagick dały podobne miniatury, choć ten pierwszy wygenerował je znacznie szybciej. Z wcześniejszych testów GD odpalane przez skrypt PHP mieściło się między PIL a ImageMagick pod względem czasu generowania miniatur.
RkBlog

31 July 2008;

Comment article