GD を使った画像のリサイズ

Yossy
2022-09-20
2022-09-20
サーバーを契約いただくと、たいていの場合、GD モジュールが利用可能な状態でインストールされています。

今回は、GD を利用した、画像のリサイズをPHPを利用して作成してみます。
サイズ違いの画像を、指定したサイズの画像で変換したいなど、商品マスタ登録時や、サムネイル作成時に役立つかもしれません

今回は、convert 関数に機能をまとめました。

function convert($readFileName, $writeFileName, $x9 = 1024, $y9 = 768)

引数
$readFileName : 変換前の画像ファイル名
$writeFileName : 変換後の画像ファイル名
$x9 : 変換後の画像横サイズ
$y9 : 変換後の画像縦サイズ



<?php

convert('0020B.jpg', '0020B-CONVERT.jpg', 1024, 768);

function convert($readFileName, $writeFileName, $x9 = 1024, $y9 = 768) {

    $im1 = imagecreatefromjpeg($readFileName);
    
    $x1 = imagesx($im1);
    $y1 = imagesy($im1);

    // X軸に合わせて、変換後サイズズ計算
    $x2 = $x9;
    $y2 = floor($x2 * $y1 / $x1);

    // 変換後のサイズが大きすぎる場合は、Y軸を基準に再計算
    if ($y2 > $y9) {
        echo('XX');
        $y2 = $y9;
        $x2 = floor($x1 * $y2 / $y1);
    }

    // 変換後の画像を作成
    $im2 = imagecreatetruecolor($x9, $y9);
    
    // 再サンプリングを行いイメージを伸縮
    imagecopyresampled($im2, $im1, ($x9 - $x2)/2, ($y9 - $y2)/2, 0, 0, $x2, $y2, $x1, $y1);

    // 伸縮した画像を保存
    imagejpeg($im2, $writeFileName);
}



実行すると、以下のような結果が得られます。

処理の流れとしては、処理前の画像のサイズをみて、縦長、横長によって変換後の画像サイズを計算して、GD の imagecopyresampled 関数を利用して、再サンプリングした画像を作成して出力しています。

非常にシンプルなコードで実現できました。

噂によると、GD ライブラリよりも、ImageMagicK ライブラリの方が、再サンプリングが綺麗という噂も聞いたことがあるのですが、今回の実験では、GD でも十分なクオリティーがあるようにも、思えました。

変換結果