0

この小さな関数を作成して、より大きなjpg / jpeg / pngソースのサムネイル画像を生成しました。これは、jpg / jpeg画像で完全に機能しますが、png画像のサイズによっては、不確定なポイントで関数がクラッシュします。小さな300x200の画像は機能しますが、2880x1800のようなものは機能しません。

これが私の(注釈付き)関数です:

function make_thumb($filename, $destination, $desired_width) {
    $extension = pathinfo($filename, PATHINFO_EXTENSION);

    // Read source image
    if ($extension == 'jpg' || $extension == 'jpeg') {
        $source_image = imagecreatefromjpeg($filename); 
    } else if ($extension == 'png') {
        $source_image = imagecreatefrompng($filename); // I think the crash occurs here. 
    } else {
        return 'error';
    }

    $width = imagesx($source_image);
    $height = imagesy($source_image);

    $img_ratio = floor($height / $width);

    // Find the "desired height" of this thumbnail, relative to the desired width
    $desired_height = floor($height * ($desired_width / $width));

    // Create a new "virtual" image
    $virtual_image = imagecreatetruecolor($desired_width, $desired_height);

    // Copy source image at a resized size
    imagecopyresampled($virtual_image, $source_image, 0, 0, 0, 0, $desired_width, $desired_height, $width, $height);

    // Create the physical thumbnail image to its destination 
    if ($extension == 'jpg' || $extension == 'jpeg') {
        $source_image = imagejpeg($virtual_image, $destination); 
    } else if ($extension == 'png') {
        $source_image = imagepng($virtual_image, $destination, 1);
    } else {
        return 'another error';
    }
}

私と同様の問題について言及していることがわかった唯一のドキュメントはこれでした。これは私の問題ですか?解決策はありますか?なぜこれを行うのですか?

4

2 に答える 2

1

ほとんどの場合、メモリが不足しています。True Color の 2880 x 1800 には、約 20 メガバイトが必要です。

php.ini を確認してくださいmemory_limit

于 2013-02-25T03:07:42.767 に答える
1

私はアホです。それまたはPHPは、大きなPNG画像の処理が本当に苦手です。PHP ドキュメントのこのコメントは、次のように述べています。imagepng()

スクリプトを完了できませんでした: 致命的なエラー: XX バイトの許容メモリ サイズを使い果たしました (XX+n バイトを割り当てようとしました)。

PHP は非圧縮形式の画像を処理することがわかりました。入力画像は 8768x4282@32 ビット => 単一のメモリ内コピーあたり ~150 MB でした。

解決策として、サイズを確認して大きすぎるものを拒否するか、私が行ったように ini_set('memory_limit','1024M'); を使用できます。ページの開始時に (サーバーに十分なオンボード メモリがある場合)。

ini_set('memory_limit','1024M');したがって、 !!!を使用して使用可能なメモリ制限を増やすことを忘れないでください。

于 2013-02-25T03:10:08.730 に答える