Изменение размера искаженного изображения с помощью PHP

У меня есть форма загрузки, где вы выбираете фотографии. После загрузки я изменяю размер изображения, если это необходимо.

Кажется, любая фотография, которую я загружаю, где HEIGHT > WIDTH растягивает изображение. Если я загружаю изображение, где WIDTH > HEIGHT, оно работает нормально. Я ломал голову, пытаясь понять это. Я почти уверен, что знаю, какая строка является проблемой, и я указал на это в комментарии.

Может ли кто-нибудь увидеть, что не так с моей математикой? Спасибо!

<?php
$maxWidth  = 900;
$maxHeight = 675;
$count     = 0;

foreach ($_FILES['photos']['name'] as $filename)
{
    $uniqueId   = uniqid();
    $target     = "../resources/images/projects/" . strtolower($uniqueId . "_" . $filename);
    $file       = $_FILES['photos']['tmp_name'][$count];    
    list($originalWidth, $originalHeight) = getimagesize($file);

    // if the image is larger than maxWidth or maxHeight
    if ($originalWidth > $maxWidth || $originalHeight > $maxHeight)
    {
        $ratio = $originalWidth / $originalHeight;

        // I think this is the problem line
        (($maxWidth / $maxHeight) > $ratio) ? $maxWidth = $maxWidth * $ratio : $maxHeight = $maxWidth / $ratio; 

        // resample and save
        $image_p    = imagecreatetruecolor($maxWidth, $maxHeight);
        $image      = imagecreatefromjpeg($file);
        imagecopyresampled($image_p, $image, 0, 0, 0, 0, $maxWidth, $maxHeight, $originalWidth, $originalHeight);
        $image      = imagejpeg($image_p, $target, 75);
    }
    else
    {
        // just save the image
        move_uploaded_file($file,$target);
    }
    $count += 1;
}
?>

person Ronnie    schedule 04.01.2013    source источник


Ответы (1)


При масштабировании вам необходимо изменить как ширину, так и высоту цели.

Пытаться:

if ($originalWidth > $maxWidth || $originalHeight > $maxHeight)
{
    if ($originalWidth / $maxWidth > $originalHeight / $maxHeight) {
        // width is the limiting factor
        $width = $maxWidth;
        $height = floor($width * $originalHeight / $originalWidth);
    } else { // height is the limiting factor
        $height = $maxHeight;
        $width = floor($height * $originalWidth / $originalHeight);
    }
    $image_p    = imagecreatetruecolor($width, $height);
    $image      = imagecreatefromjpeg($file);
    imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $originalWidth, $originalHeight);
    $image      = imagejpeg($image_p, $target, 75);
}
person phihag    schedule 04.01.2013
comment
Как я не думал, что оба нужно изменить, выше моего понимания, лол ... это сработало! Большое спасибо! Я приму ваш ответ через 1 минуту, когда это позволит мне - person Ronnie; 05.01.2013