在PHP中调整图像大小的智能方法

时间:2009-12-15 11:46:21

标签: php image-manipulation

我想知道是否有人可以帮助我使用PHP编写的图像大小调整功能但是必须重新调整图像大小,但是像PHPThumb那样。因此,如果我设置新图像的宽度和高度,该函数必须适合上传的图像(和宽高比)新的宽度和高度。

感谢任何帮助。

谢谢。

6 个答案:

答案 0 :(得分:7)

几年前我写过这篇文章,它正是你所寻找的。请记住,这只计算宽度和高度,您必须自己调用Imagick来实际应用这些计算。

/**
* ImageIntelligentResize()
* 
* @global Intelligently resizes images using a providid max width and height
* @param mixed $imagePath
* @param mixed $maxWidth
* @param mixed $maxHeight
* @param mixed $alwaysUpscale
* @return
*/
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);
}

答案 1 :(得分:3)

当我开始学习OOP时,我想this image class来练习自己。

它使用GD,当然可以改进,希望它有所帮助。

编辑:在我没有任何控制权的问题的2个downvotes之后,我把课程放在了牧场上。

The class

The Example

请记住,该课程运作良好,但这是一种练习,以便学习基础知识OOP。

我希望这可以,你懒惰的用户;)

在圣诞节我们都是更好的人

答案 2 :(得分:2)

  • 调整大小然后裁剪方法:计算源图像的纵横比并将其用作约束来创建一个中间图像,该中间图像将大于目标图像(宽度或高度) - 最后将中间图像裁剪为目标尺寸。

  • 使用seam carving!也称为"liquid rescale" in ImageMagick(另见there

如果您可以依赖服务器上安装的ImageMagick,它提供的功能远远多于GD。

答案 3 :(得分:2)

从我的理解来看,OP的问题更多的是关于计算新维度,而不是调整大小

@Psyche,这实际上是一个简单的算术问题。假设您有一个640x480的图像,并希望在200x200“框”中显示它。

$sw = 640; $sh = 480;
$dw = 200; $dh = 200;

找出盒子的纵横比,将其与原件的纵横比进行比较,并计算新图像的高度宽度

$sr = $sw / $sh;
$dr = $dw / $dh;
if($sr > $dr)
    $dh = round($dw / $sr);
else
    $dw = round($dh * $sr); 

这为您提供了200x150,这是缩放原始图像所需的尺寸

答案 4 :(得分:0)

我会使用GDImageMagick。两个伟大的图书馆都可以做到这一点。

答案 5 :(得分:0)