1. ホーム
  2. php

[解決済み] PHP による効率的な JPEG 画像のリサイズ

2023-05-31 13:15:38

質問

PHP で大きな画像をリサイズする最も効率的な方法は何ですか?

現在、私は GD 関数 imagecopyresampled を使って高解像度の画像を取得し、ウェブ表示用のサイズ(およそ幅700ピクセル×高さ700ピクセル)にきれいにリサイズしています。

これは、小さい (2 MB 未満) 写真では非常に効果的で、リサイズ操作全体がサーバー上で 1 秒未満で完了します。しかし、このサイトは最終的には、最大 10 MB (または最大 5000x4000 ピクセル) のサイズの画像をアップロードする写真家にサービスを提供する予定です。

大きな画像でこの種のリサイズ操作を行うと、メモリ使用量が非常に大きくなる傾向があります (大きな画像では、スクリプトのメモリ使用量が 80 MB を超えて急上昇することがあります)。このリサイズ操作をより効率的にする方法はありますか? 次のような別の画像ライブラリを使用すべきでしょうか? ImageMagick ?

今現在、リサイズのコードは以下のような感じです。

function makeThumbnail($sourcefile, $endfile, $thumbwidth, $thumbheight, $quality) {
    // Takes the sourcefile (path/to/image.jpg) and makes a thumbnail from it
    // and places it at endfile (path/to/thumb.jpg).

    // Load image and get image size.
    $img = imagecreatefromjpeg($sourcefile);
    $width = imagesx( $img );
    $height = imagesy( $img );

    if ($width > $height) {
        $newwidth = $thumbwidth;
        $divisor = $width / $thumbwidth;
        $newheight = floor( $height / $divisor);
    } else {
        $newheight = $thumbheight;
        $divisor = $height / $thumbheight;
        $newwidth = floor( $width / $divisor );
    }

    // Create a new temporary image.
    $tmpimg = imagecreatetruecolor( $newwidth, $newheight );

    // Copy and resize old image into new image.
    imagecopyresampled( $tmpimg, $img, 0, 0, 0, 0, $newwidth, $newheight, $width, $height );

    // Save thumbnail into a file.
    imagejpeg( $tmpimg, $endfile, $quality);

    // release the memory
    imagedestroy($tmpimg);
    imagedestroy($img);

どのように解決するのですか?

ImageMagickの方がずっと速いと言われます。せいぜい両ライブラリを比較して、それを測定するだけです。

  1. 典型的な画像を1000枚用意します。
  2. 2つのスクリプトを書く -- 1つはGD用、もう1つは ImageMagickのためのものです。
  3. その両方を数回実行します。
  4. 結果を比較する (総実行時間 時間、CPUとI/Oの使用量、結果 の画質) を比較します。

誰もが最高と思うものが、あなたにとって最高であるとは限りません。

また、私の意見では、ImageMagickはより良いAPIインターフェースを持っています。