在PHP中调整任意图像大小

时间:2009-01-20 12:50:38

标签: php

调整图像大小的最佳方法是什么,可以是任意尺寸,固定尺寸,或至少适合固定尺寸?

图像来自不受我控制的随机网址,我必须确保图像不会超出大约250px x 300px或20%x 50%的区域。

我认为我会首先确定大小,如果它超出范围,请调整大小,但我不确定如果图像大小可能是任何东西,如何计算调整大小的逻辑。

编辑:我没有对图像的本地访问权限,图像网址是一个变量,用img src = ...输出,我需要一种方法来指定宽度和高度标记的值。

6 个答案:

答案 0 :(得分:4)

使用ImageMagick很容易。您可以通过exec使用转换命令行工具,也可以使用http://www.francodacosta.com/phmagick/resizing-images 如果您使用'转换',您甚至可以告诉ImageMagick只调整较大的图片大小并且不转换较小的图片:http://www.imagemagick.org/Usage/resize/

如果您没有本地访问权限,则无法使用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 :(得分:1)

您是否查看了GD库文档,尤其是imagecopyresized方法?

答案 2 :(得分:1)

如果你必须保持图像的纵横比不变,那么你应该将其缩放一个因子,使图像的较长边(高度或宽度)符合该边的限制。

答案 3 :(得分:0)

您可以使用以下内容:

$maxWidth  = 250;
$maxHeight = 500;

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

&=bitwise-and operator &assignment operator =的组合运算符。因此$foo &= *expr*$foo = $foo & *expr*是等效的。

答案 4 :(得分:0)

我不确定你答案的确切解决方案,但我知道用PHP编写的项目有解决方案。去看看为Drupal CMS构建的ImageCache,它是用PHP编写的。

它基本上让你定义一些动作来拍摄任意图像,并产生你想要的任何缩放/裁剪图像。

你必须学习一些Drupal API才能理解这个例子,但它很广泛,如果你理解他们的算法,你就能解决其他更复杂的问题。

答案 5 :(得分:0)

我创建了以下功能来根据比例智能调整图像大小,甚至还有一个参数可以放大较小的图像(如果缩略图尺寸很大,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);
}