アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

GDとImageMagickの画質比較

こんばんは、牧野です。
以前、GDでの画像処理を紹介しました。
今日はPHPでよく使われるもう1つの画像処理方法、ImageMagickを使うやり方で画質にどれくらい差があるのか比べてみました。

まずは早速、テスト用プログラムです。

gd_test.php


<?php
$image_file = 'sample.jpg';

$img = new MyImage($image_file);
$img->resizeImage(500, 500);
$img->createImageFile('.', 'gd_sample.jpg');

header('Content-type: image/jpeg');
readfile('gd_sample.jpg');

class MyImage {
    var $img;
    var $width;
    var $height;
    var $font_path;

    function MyImage($image_path, $font_file_path = null) {
        $this->img = imagecreatefromjpeg($image_path);
        $this->width = imagesx($this->img);
        $this->height = imagesy($this->img);
    }

    function resizeImage($max_w, $max_h) {
        if (floatval($max_w / $this->width - 1) <= floatval($max_h / $this->height - 1)) {
            $rate = floatval($max_w / $this->width);
            $new_w = $max_w;
            $new_h = (int)min(intval($this->height * $rate), $max_h);
        } else {
            $rate = floatval($max_h / $this->height);
            $new_w = (int)min(intval($this->width * $rate), $max_w);
            $new_h = $max_h;
        }
        $new_img = imagecreatetruecolor($new_w, $new_h);

        if (imagecopyresampled($new_img, $this->img, 0, 0, 0, 0, $new_w, $new_h, $this->width, $this->height)) {
            $this->img = $new_img;
            return true;

        } else {
            return false;
        }
    }

    function createImageFile($new_file_dir, $new_file_name) {
        $new_file_path = $new_file_dir .'/'. $new_file_name;
        $result = imagejpeg($this->img, $new_file_path, 100);
        chmod($new_file_path, 0666);
        return $result;
    }
}


imagick_test.php


<?php
$image_file = 'sample.jpg';

$img = new MyImage($image_file);

header('Content-type: image/jpeg');
echo $img->createResizedImage(500, 500);

class MyImage {
    var $img_path;
    var $width;
    var $height;
    var $font_file_path;

    function MyImage($image_path) {
        $this->img_path = $image_path;
        $image_info = getimagesize($this->img_path);
        $this->width = $image_info[0];
        $this->height = $image_info[1];
    }

    function createResizedImage($max_w, $max_h, $new_file_dir = null, $new_file_name = null) {
        if ($new_file_name) {
            $new_file_path = $new_file_dir .'/'. $new_file_name;
            $cmd = "convert ". $this->img_path ." -resize {$max_w}x{$max_h} {$new_file_path} ";
            system($cmd);
        } else {
            $cmd = "convert ". $this->img_path ." -resize {$max_w}x{$max_h} -";
            return shell_exec($cmd);
        }
    }

}


GDの場合、以前笹亀さんが書いていたように、サムネイル画像サイズを自力で計算する必要があります。
ImageMagickpeclエクステンションもありますが、サーバにインストールされているImageMagickPHPのバージョンの制限がわりと厳しいので、コマンドラインから使う方が手軽だと思います。

今回比べたかったのは画質なので、それ以外のことはとりあえず無視します。
(プログラムの書き方がいい加減というつっこみは今回はできればなしの方向で。。。)
画像をアップロードして、それを適当な大きさの表示用画像とサムネイル画像にサイズ変更して保存する、という機能は、ウェブアプリケーションでは比較的よくある機能だと思います。その時にどれくらい差が出るものなのかを調べるのが今回の目的です。
元画像のsample.jpgは、615×410で、今回のテストでは少しだけ小さくしています。

結果は、、

GDで変換した画像



ImageMagickで変換した画像


元画像はこちら

ブログの写真では変わらないように見えるかもしれませんが、ImageMagickを使ったほうがピントが合っているような感じで少し綺麗でした。
ということで、ImageMagickの方が画質的にはいいということがわかりました。

GD、ImageMagickともに様々な関数、オプションが用意されています。
GDでもこの関数をこんなふうにするともっと綺麗になる、等、何かご存知の方がいましたら、ぜひお知らせ下さい。