1

私は非常に多くの画像に取り組んでいます。各画像の4つのJPEGバージョンを作成する必要があります。

  • 元のサイズのJPEG
  • 700x430バージョン
  • 57x57サムネイル
  • 167xNサムネイル(可変高さ、アスペクト比を維持)

次の2つのヘルパー関数を使用しました。

function thumbFixed($srcfile, $dstfile, $dstWidth, $dstHeight) {
    $srcImg = imagecreatefromstring(file_get_contents($srcfile));
    list($srcWidth, $srcHeight) = getimagesize($srcfile);
    $srcAR = $srcWidth / $srcHeight;

    $dstAR = $dstWidth / $dstHeight;

    $dstImg = imagecreatetruecolor($dstWidth, $dstHeight);

    if($srcAR >= $dstAR) {
        $cropHeight = $dstHeight;
        $cropWidth = (int)($dstHeight * $srcAR);
    } else {
        $cropWidth = $dstWidth;
        $cropHeight = (int)($dstWidth / $srcAR);
    }

    $cropImg = imagecreatetruecolor($cropWidth, $cropHeight);
    imagecopyresampled($cropImg, $srcImg, 0, 0, 0, 0, $cropWidth, $cropHeight, $srcWidth, $srcHeight);

    $dstOffX = (int)(($cropWidth - $dstWidth) / 2);
    $dstOffY = (int)(($cropHeight - $dstHeight) / 2);

    imagecopy($dstImg, $cropImg, 0, 0, $dstOffX, $dstOffY, $dstWidth, $dstHeight);
    imagejpeg($dstImg, $dstfile);
}

function thumbGrid($srcfile, $dstfile, $dstWidth) {
    $srcImg = imagecreatefromstring(file_get_contents($srcfile));
    list($srcWidth, $srcHeight) = getimagesize($srcfile);
    $srcAR = $srcWidth / $srcHeight;

    $dstHeight = $dstWidth / $srcAR;

    $dstImg = imagecreatetruecolor($dstWidth, $dstHeight);

    imagecopyresampled($dstImg, $srcImg, 0, 0, 0, 0, $dstWidth, $dstHeight, $srcWidth, $srcHeight);
    imagejpeg($dstImg, $dstfile);
}

これらの関数は、このコンテキストで使用されます。

$img = imagecreatefromstring(file_get_contents($local));
imagejpeg($img, 'temp.jpg', 100);
thumbFixed($local, 'gallery.jpg', 700, 430);
thumbFixed($local, 'thumbsmall.jpg', 57, 57);
thumbGrid($local, 'grid.jpg', 167);

$local画像のパス名を保持する場所。

コードはほとんどの画像で問題なく機能しますが、1792x1198、356KbJPEGファイルである特定のケースでは誤動作します。しかし、私はそれを追跡することができないように見えるので、私は不正行為を非常に心配しています:gdbPHPインタープリターで実行するとProgram exited with code 0377.(PHPがexit(-1)編集されたことを意味します)、他には何もありません-スタックトレース、エラー、フィードバックはありません何でも。

すべてのlibgd呼び出しの前にさまざまなエコーを挿入することで、スクリプトが関数で実行するときにPHPを「クラッシュ」させることがわかりました$cropImg = imagecreatetruecolor($cropWidth, $cropHeight);thumbFixed、コードから制御できないため、これを回避する方法を理解できないようです。また、デバッガーからバックトレースすることもできません。誰かがこれについて同様の経験をしていて、私にいくつかの指針を与えることができますか?

4

0 に答える 0