0

ユーザーが写真をアップロードできるようにしたい。GD ライブラリを使用して、ギャラリー用に 3 つの異なるサイズの画像を作成/保存し、製品を表示します。問題は、さまざまなサイズの画像をアップロードした人のサイズをスケーリングすることです。たとえば、4000 x 3000 の画像は、必要な 240 x 180 にスケーリングされますが、3008 x 2000 や 3837 x 2551 など、これにスケーリングされない異なるサイズの写真を持っているユーザーがいることに気付きました。

これらの異なる画像サイズを処理して共通のサイズにスケーリングできるようにするための最良の方法を教えてください。

4

2 に答える 2

1

最終的なサイズを設定する必要があります。例: 300x300 ピクセル

次に、両方の要素を元の寸法で割ります。

factor1=300/4000 <- Width
factor2=300/3000 <- Heigth

次に、より小さい係数で画像をスケーリングします。高さまたは幅が 300 ピクセルの画像が作成されます。これで、最終的な寸法よりも大きいものはすべてカットされます。終了した!

それが役立つことを願っています

于 2012-10-21T18:13:32.747 に答える
0

私はあなたがそのような機能を探していると思います:

function resizePreservingAspectRatio($img, $targetWidth, $targetHeight)
{
    $srcWidth = imagesx($img);
    $srcHeight = imagesy($img);

    // Determine new width / height preserving aspect ratio
    $srcRatio = $srcWidth / $srcHeight;
    $targetRatio = $targetWidth / $targetHeight;
    if (($srcWidth <= $targetWidth) && ($srcHeight <= $targetHeight))
    {
        $imgTargetWidth = $srcWidth;
        $imgTargetHeight = $srcHeight;
    }
    else if ($targetRatio > $srcRatio)
    {
        $imgTargetWidth = (int) ($targetHeight * $srcRatio);
        $imgTargetHeight = $targetHeight;
    }
    else
    {
        $imgTargetWidth = $targetWidth;
        $imgTargetHeight = (int) ($targetWidth / $srcRatio);
    }

    // Creating new image with desired size
    $targetImg = imagecreatetruecolor($targetWidth, $targetHeight);

    // Add transparency if your reduced image does not fit with the new size
    $targetTransparent = imagecolorallocate($targetImg, 255, 0, 255);
    imagefill($targetImg, 0, 0, $targetTransparent);
    imagecolortransparent($targetImg, $targetTransparent);

    // Copies image, centered to the new one (if it does not fit to it)
    imagecopyresampled(
       $targetImg, $img, ($targetWidth - $imgTargetWidth) / 2, // centered
       ($targetHeight - $imgTargetHeight) / 2, // centered
       0, 0, $imgTargetWidth, $imgTargetHeight, $srcWidth, $srcHeight
    );

    return $targetImg;
}

使用例:

$gd = imagecreatefromjpeg("images/image5.jpg");
$resized = resizePreservingAspectRatio($gd, 100, 100);
header("Content-type: image/png");
imagepng($resized);

これはそのような画像を変換します:

ここに画像の説明を入力

その人に:

ここに画像の説明を入力

于 2012-10-21T18:18:48.333 に答える