私は非常に多くの画像に取り組んでいます。各画像の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ファイルである特定のケースでは誤動作します。しかし、私はそれを追跡することができないように見えるので、私は不正行為を非常に心配しています:gdb
PHPインタープリターで実行するとProgram exited with code 0377.
(PHPがexit(-1)
編集されたことを意味します)、他には何もありません-スタックトレース、エラー、フィードバックはありません何でも。
すべてのlibgd呼び出しの前にさまざまなエコーを挿入することで、スクリプトが関数で実行するときにPHPを「クラッシュ」させることがわかりました$cropImg = imagecreatetruecolor($cropWidth, $cropHeight);
がthumbFixed
、コードから制御できないため、これを回避する方法を理解できないようです。また、デバッガーからバックトレースすることもできません。誰かがこれについて同様の経験をしていて、私にいくつかの指針を与えることができますか?