1

HTML で次のコードを使用して、php ファイルを呼び出してサムネイルを作成し、このページに表示します &w=150&h=&00" alt="Image" />

miniature.php のコードは次のとおりです。

     <?php

     function redimensionner_image($chemin_image, $largeur_max, $hauteur_max)
    {
list($src_w, $src_h) = getimagesize($chemin_image);
$dst_w = $largeur_max;
$dst_h = $hauteur_max;

if($src_w < $dst_w)
    $dst_w = $src_w;

// Teste les dimensions tenant dans la zone
$test_h = round(($dst_w / $src_w) * $src_h);
$test_w = round(($dst_h / $src_h) * $src_w);

if(!$dst_h)// Si Height final non précisé (0)
    $dst_h = $test_h;
elseif(!$dst_w) // Sinon si Width final non précisé (0)
    $dst_w = $test_w;
elseif($test_h>$dst_h) // Sinon teste quel redimensionnement tient dans la zone
    $dst_w = $test_w;
else
    $dst_h = $test_h;

$array_ext = explode('.', $chemin_image);
$extension = strtolower($array_ext[count($array_ext)-1]);

if($extension == 'jpg' || $extension == 'jpeg')
   $img_in = imagecreatefromjpeg($chemin_image);
else if($extension == 'png')
   $img_in = imagecreatefrompng($chemin_image);
else if($extension == 'gif')
   $img_in = imagecreatefromgif($chemin_image);
else
    return false;

$img_out = imagecreatetruecolor($dst_w, $dst_h);
imagecopyresampled($img_out, $img_in, 0, 0, 0, 0, $dst_w, $dst_h, imagesx($img_in), imagesy($img_in));

imagejpeg($img_out);
     }

      ?>

ただし、Imagecreatefromjpeg は、サイズ変更後に黒いイメージを返します。助けてください

4

1 に答える 1

3

まず、ファイル拡張子を展開する必要はありませんgetimagesize。タイプが得られます。

list($width, $height, $type) = getimagesize($source);

次に、サイズの計算には従いません。単純化してみてください。fe:

$scale = min($maxWidth / $width, $maxHeight / $height, 1); // We only use downsampling, no upsampling! If you need upsampling remove the '1' parameter

$newWidth = min($width * $scale, $maxWidth);
$newHeight = min($height * $scale, $maxHeight);

簡単な再スケーリングと縦横比の保持。

参考までに、プロジェクトで使用するコードを次に示します。

function SaveImageAsJpeg($sourceFilename, $destFilename, $maxWidth = 0, $maxHeight = 0, $jpegQuality = 80) {
    list($width, $height, $type) = getimagesize($sourceFilename);

    $sourceImage = false;

    switch ($type) {
        case IMAGETYPE_GIF:
            $sourceImage = imagecreatefromgif($sourceFilename); 
            break;
        case IMAGETYPE_JPEG:
            $sourceImage = imagecreatefromjpeg($sourceFilename);
            break;
        case IMAGETYPE_PNG:
            $sourceImage = imagecreatefrompng($sourceFilename);
            break;
    }

    if (!$sourceImage)
        return false;

    if (($maxWidth == 0) || ($maxHeight == 0)) {
        // Don't resize
        $destinationImage = imagecreatetruecolor($width, $height);
        imagecopy($destinationImage, $sourceImage, 0, 0, 0, 0, $width, $height);
        imagejpeg($destinationImage, $destFilename, $jpegQuality);
        imagedestroy($destinationImage);
    } else {
        // Resize image
        $scale = min($maxWidth / $width, $maxHeight / $height, 1);  // We only use downsampling, no upsampling! If you need upsampling remove the '1' parameter

        $newWidth = min($width * $scale, $maxWidth);
        $newHeight = min($height * $scale, $maxHeight);

        $destinationImage = imagecreatetruecolor($newWidth, $newHeight);
        imagecopyresampled($destinationImage, $sourceImage, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
        imagejpeg($destinationImage, $destFilename, $jpegQuality);
        imagedestroy($destinationImage);
    }

    imagedestroy($sourceImage);

    return true;
}

もちろん、上記のコードは画像データを返しません。再スケーリングされた画像をサーバー上の別のファイルに保存するだけです。ただし、パラメーターNULLとして渡すと$destFilename、画像データが出力ストリームに出力されます。

header('Content-Type: image/jpeg');
SaveImageAsJpeg($sourceFilename, NULL, 200, 200);

それでも黒い画像が表示される場合は、PHP のメモリ制限を増やすことをお勧めします。を変更できる場合は、設定PHP.INIを調整しmemory_limitます。それ以外の場合は、.htaccessこの行 fe: を含むファイルを使用してくださいphp_value memory_limit 64M

于 2012-09-03T18:09:03.087 に答える