Произвольное изменение размера изображения в PHP - PullRequest
3 голосов
/ 20 января 2009

Каков наилучший способ изменить размеры изображений, которые могут иметь любой размер, фиксированный размер или, по крайней мере, соответствовать фиксированному размеру?

Изображения поступают со случайных URL, которые не находятся под моим контролем, и я должен убедиться, что изображения не выходят за пределы области размером примерно 250 x 300 пикселей или 20% на 50% слоя.

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

edit: у меня нет локального доступа к изображению, а URL-адрес изображения находится в переменной с выводом с помощью img src = ..., мне нужен способ указать значения тегов width и height.

Ответы [ 6 ]

4 голосов
/ 20 января 2009

Это легко сделать с помощью ImageMagick. Либо вы используете инструмент конвертирования командной строки через exec, либо вы используете http://www.francodacosta.com/phmagick/resizing-images.
Если вы используете «конвертировать», вы даже можете сказать ImageMagick просто изменить размеры больших изображений и не конвертировать меньшие:

Если у вас нет локального доступа, вы не сможете использовать ImageMagick:

<?php
$maxWidth  = 250;
$maxHeight = 500;

$size = getimagesize($url);
if ($size) {
    $imageWidth  = $size[0];
    $imageHeight = $size[1];
    $wRatio = $imageWidth / $maxWidth;
    $hRatio = $imageHeight / $maxHeight;
    $maxRatio = max($wRatio, $hRatio);
    if ($maxRatio > 1) {
        $outputWidth = $imageWidth / $maxRatio;
        $outputHeight = $imageHeight / $maxRatio;
    } else {
        $outputWidth = $imageWidth;
        $outputHeight = $imageHeight;
    }
}
?>
1 голос
/ 20 января 2009

Если вам нужно сохранить соотношение сторон изображения без изменений, то вы должны масштабировать его таким образом, чтобы длинная сторона изображения (высота или ширина) соответствовала ограничениям для этой стороны.

1 голос
/ 20 января 2009

Вы смотрели документацию библиотеки GD, в частности метод imagecopyresized ?

0 голосов
/ 20 января 2009

Я создал следующую функцию для интеллектуального изменения размера изображений по отношению к соотношению и даже имеет параметр для увеличения масштаба изображений меньшего размера (что очень важно, если макет HTML искажается при уменьшении размера эскизов).

function ImageIntelligentResize( $imagePath, $maxWidth, $maxHeight, $alwaysUpscale )
{
    // garbage in, garbage out
    if ( IsNullOrEmpty($imagePath) || !is_file($imagePath) || IsNullOrEmpty($maxWidth) || IsNullOrEmpty($maxHeight) )
    {
        return array("width"=>"", "height"=>"");
    }

    // if our thumbnail size is too big, adjust it via HTML
    $size = getimagesize($imagePath);
    $origWidth = $size[0];
    $origHeight = $size[1];

    // Check if the image we're grabbing is larger than the max width or height or if we always want it resized
    if ( $alwaysUpscale || $origWidth > $maxWidth || $origHeight > $maxHeight )
    {   
        // it is so let's resize the image intelligently
        // check if our image is landscape or portrait
        if ( $origWidth > $origHeight )
        {
            // target image is landscape/wide (ex: 4x3)
            $newWidth = $maxWidth;
            $ratio = $maxWidth / $origWidth;
            $newHeight = floor($origHeight * $ratio);
            // make sure the image wasn't heigher than expected
            if ($newHeight > $maxHeight)
            {
                // it is so limit by the height
                $newHeight = $maxHeight;
                $ratio = $maxHeight / $origHeight;
                $newWidth = floor($origWidth * $ratio);
            }
        }
        else
        {
            // target image is portrait/tall (ex: 3x4)
            $newHeight = $maxHeight;
            $ratio = $maxHeight / $origHeight;
            $newWidth = floor($origWidth * $ratio);
            // make sure the image wasn't wider than expected
            if ($newWidth > $maxWidth)
            {
                // it is so limit by the width
                $newWidth = $maxWidth;
                $ratio = $maxWidth / $origWidth;
                $newHeight = floor($origHeight * $ratio);
            }
        }
    }
    // it's not, so just use the current height and width
    else
    {
        $newWidth = $origWidth;
        $newHeight = $origHeight;
    }   

    return array("width"=>$newWidth, "height"=>$newHeight);
}
0 голосов
/ 20 января 2009

Я не уверен в точном решении вашего ответа, но я знаю проект, написанный на PHP, который имеет решение. Откройте для себя ImageCache, созданный для Drupal CMS, который написан на PHP.

Это в основном позволяет вам определить некоторые действия для произвольного изображения и производить практически любое масштабирование / обрезку, которое вы хотите для изображения.

Вам нужно изучить несколько API-интерфейсов Drupal, чтобы понять этот пример, но он обширный, и если вы поймете их алгоритмы, вы сможете решить другие более сложные проблемы.

0 голосов
/ 20 января 2009

Вы можете использовать следующее:

$maxWidth  = 250;
$maxHeight = 500;

$validSize = true;
$imageinfo = getimagesize($filename);
if ($imageinfo) {
    $validSize &= $imageinfo[0] <= $maxWidth;
    $validSize &= $imageinfo[1] <= $maxHeight;
}

&= является объединенным оператором побитового оператора и & и оператора присваивания =. Таким образом, $foo &= *expr* и $foo = $foo & *expr* эквивалентны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...