0

このコードは、数週間前から問題を抱えていて、解決に近づいていません...

function create_thumbnail($source, $destination, $thumb_width){
    $extension = get_image_extension($source);
    $size = getimagesize($source);
    $imageWidth  = $newWidth  = $size[0];
    $imageHeight = $newheight = $size[1];

    if ($imageWidth > $thumb_width || $imageHeight > $thumb_width)
    {
        // Calculate the ratio
        $xscale = ($imageWidth/$thumb_width);
        $yscale = ($imageHeight/$thumb_width);
        $newWidth  = ($yscale > $xscale) ? round($imageWidth * (1/$yscale)) : round($imageWidth * (1/$xscale));
        $newHeight = ($yscale > $xscale) ? round($imageHeight * (1/$yscale)) : round($imageHeight * (1/$xscale));
    }

    $newImage = imagecreatetruecolor($newWidth, $newHeight);

    switch ($extension)
    {
        case 'jpeg':
        case 'jpg':
            $imageCreateFrom = 'imagecreatefromjpeg';
            $store = 'imagejpeg';
            break;

        case 'png':
            $imageCreateFrom = 'imagecreatefrompng';
            $store = 'imagepng';
            break;

        case 'gif':
            $imageCreateFrom = 'imagecreatefromgif';
            $store = 'imagegif';
            break;

        default:
            return false;
    }

    $container = $imageCreateFrom($source);
    imagecopyresampled($newImage, $container, 0, 0, 0, 0, $newWidth, $newHeight, $imageWidth, $imageHeight);
    return $store($newImage, $destination);
}

現在は問題なく動作していますが、これらのサイズ変更された画像が入るスペースは 200 (高さ) x 225 (幅) で、背が高くて細い画像や、短くて幅が広い画像が表示されることがあります。それらをスペースに収めるために、理想的には、これらの画像を押しつぶしたり切り取ったりしてサイズを変更できる場合ですが、それが可能かどうかはわかりません...そうですか?

それが不可能な場合は、このコードを調整しようとしていると思います。そのため、高さが200の高さでサイズ変更する画像が背が高くて細い場合、および画像が幅225にサイズ変更するために幅が広く短い場合...これを願っています理にかなっています。

とにかく、ヒント、アドバイス、または何でもいただければ幸いです。

mschrコード(以下の回答)を実行しようとしましたが、これらのエラーが発生しました

Warning: imagecreatetruecolor() [function.imagecreatetruecolor]: Invalid image dimensions in /home/content/44/8713044/html/admin/Home.php on line 321

Warning: imagecopyresampled(): supplied argument is not a valid Image resource in /home/content/44/8713044/html/admin/Home.php on line 323

Warning: Cannot modify header information - headers already sent by (output started at /home/content/44/8713044/html/admin/include/header.php:7) in /home/content/44/8713044/html/admin/Home.php on line 325

Warning: imagejpeg(): supplied argument is not a valid Image resource in /home/content/44/8713044/html/admin/Home.php on line 329

Warning: imagedestroy(): supplied argument is not a valid Image resource in /home/content/44/8713044/html/admin/Home.php on line 334
4

2 に答える 2

0

なるほど..画像データで $destination を設定したい場合、上記の投稿は次のように GET リクエストを介して画像を提供する関数を示しています。

http://localhost/thumbnail.php?w=500&h=300&file=./images/bigimage.png

一方で、thumbnail.php には関数 'thumb' が含まれており、次のように呼び出します。

<? thumb($_GET['file'], $_GET['w'], $_GET['h']); ?>

あなたが望むのは、1) $destination を受け入れるために親指が取るパラメーターを変更することです 2)ヘッダー( "Content-type ...")行を削除します 3)最後のスイッチケースを次のように書き換えます。

switch ($imgInfo[2]) {
    case 1: return imagegif($newImg, $destination);
    case 2: return imagejpeg($newImg, $destination);
    case 3: return imagepng($newImg, $destination);
    default:  trigger_error('Imposible mostrar la imagen.', E_USER_WARNING);  break;
}
 return false;
于 2012-05-02T17:27:59.340 に答える
0

これが私のやり方です。$w と $h は要求された寸法で、$nHeight と $nWidth は結果の薄暗い - 縦横比を維持します

function thumb($img, $w = 100, $h = 100, $fill = true) {
    if (!extension_loaded('gd') && !extension_loaded('gd2')) {
        trigger_error("No dispones de la libreria GD para generar la imagen.", E_USER_WARNING);
        return false;
    }

    $imgInfo = getimagesize($img);
    switch ($imgInfo[2]) {
        case 1: $im = imagecreatefromgif($img); break;
        case 2: $im = imagecreatefromjpeg($img);  break;
        case 3: $im = imagecreatefrompng($img); break;
        default:  trigger_error('Tipo de imagen no reconocido.', E_USER_WARNING);  break;
    }
    // note, how the lesser ratio is chosen
    if ($imgInfo[0] <= $w && $imgInfo[1] <= $h && !$fill) {
        $nHeight = $imgInfo[1];
        $nWidth = $imgInfo[0];
    }else{
        if ($w/$imgInfo[0] < $h/$imgInfo[1]) {
            $nWidth = $w;
            $nHeight = $imgInfo[1]*($w/$imgInfo[0]);
        }else{
            $nWidth = $imgInfo[0]*($h/$imgInfo[1]);
            $nHeight = $h;
        }
    }

    $nWidth = round($nWidth);
    $nHeight = round($nHeight);

    $newImg = imagecreatetruecolor($nWidth, $nHeight);

    imagecopyresampled($newImg, $im, 0, 0, 0, 0, $nWidth, $nHeight, $imgInfo[0], $imgInfo[1]);

    header("Content-type: ". $imgInfo['mime']);

    switch ($imgInfo[2]) {
        case 1: imagegif($newImg); break;
        case 2: imagejpeg($newImg);  break;
        case 3: imagepng($newImg); break;
        default:  trigger_error('Imposible mostrar la imagen.', E_USER_WARNING);  break;
    }

    imagedestroy($newImg);
}
于 2012-05-02T15:39:17.627 に答える