GD vs. ImageMagick

Das Fazit vorweg: ImageMagick liefert bessere Ergebnisse beim skalieren von JPGs. Während die Qualität von GD-generierten JPGs zu wünsche übrig läst, übertrifft ImageMagick sogar Photoshop (bei gleicher Dateigröße).

Ich wollte vor ein paar Tagen Logos PHP-gesteuert skalieren. Die populärsten Verfahren dafür sind die in PHP integrierte GD-Libary und die Software ImageMagick. Da ich keine Informationen über die qualitativen Ergebnisse gefunden habe, veröffentliche ich hier die Ergebnisse meiner kleinen Testreihe.

Testfall: Logos PHP-gesteuert skalieren und als JPG ausgeben.

Logos haben manchmal intensive farbige Flächen und meist harte Kontraste. Als Besipiel verwende ich dieses schöne bunte Ding:

Testbild

GD

Mein erster Versuch ist GD. PHP Version 5.2.8 (aktuell) mit GD „2.0.34 compatible“ – die aktuelle GD ist 2.0.35
Mein Code:

$pic = imagecreatefromjpeg($path);
$new_pic = imagecreatetruecolor($new_width,$new_hight);
imagecopyresampled($new_pic, $pic, 0, 0, 0, 0, $new_width, $new_height, $old_width, $old_height);
imagejpg($new_pic, $new_path, $quality);

Auch bei maximaler Qualität (100) gefällt mir das Ergebnis nicht. Die Kanten sind unscharf und haben Schatten, besonders bei dem roten G. Bei geringerer Qualität zeigen sich starke Artefakte in den Flächen. Die Schattenbildung verschwindet, wenn man das Bild als PNG ausgibt, aber ich wollte JPG. (PNG währe für Logos wahrscheinlich geeigneter. Leider ist die PNG-Ausgabe über die PHP-GD-Libary unvollständig dokumentiert. Es gibt auf php.net keine Informationen zu Paletten und Komprimierung im PNG Format und die PNG-Dateien die mit den Defaultwerten generiert werden, sind realtiv groß.)

ImageMagick

Alternativ versuche ich ImageMagick. Version 6.4.8-5-Q8-windows-static. Da man überall liest, dass es schlecht dokumentiert sei, lade ich mir noch phMagick runter.
Mein Code:

include "phMagick.php";
$phMagick = &new phMagick($pathPic,$pathNewPic);
$phMagick->setImageMagickPath("c:\programme\ImageMagick");
$phMagick->setImageQuality($quality);
$phMagick->resize($new_width, $new_height);

Der von phMagick daraus generierte Systembefehl lautet:

c:\programme\ImageMagick/convert -scale "[breite]x[höhe]>" -quality [qualität] -strip [Pfad Quelle] [Pfad Ziel]

Bei Default-Qualität (80) zeigt auch IM relativ starke Komprimierungsartefakte, aber die Ränder der Buchstaben sehen gut aus. Bei Qualität 100 ist ergbit ein perfekt skaliertes Bild mit optimaler Schärfe. Qualität 90 halbiert die Dateigröße gegenüber 100 und scheint ein guter Kompromiss zu sein. Zum vergleich skaliere ich das Bild mit Photoshop und speichere es auf gleiche Dateigröße, was einer Q. von 71 entspricht. Überraschenderweise sind die Komprimierungsartefakte in der Photoshopdatei stärker als in der IM-Datei.

Die Testreihe

Qualität GD ImageMagick
80
5,0 KB

4,6 KB
90
6,8 KB

7,9 KB
95
9,1 KB

10,4 KB
100
16,4 KB

18,5 KB

Qualität Photoshop ImageMagick
71 / 90
7,7 KB

7,9 KB

GD, PNG:


GD, unskaliert, JPG, Qualität 100