将全景图像调整为固定大小

时间:2011-03-01 17:23:13

标签: php resize

我想将图像调整为固定的宽度和高度(即150px)。然而,问题是,如果原始照片的高度和宽度存在很大差异(例如,全景照片),则调整大小的缩略图看起来很糟糕。有没有任何智能解决方案可以将照片调整到固定的宽度和高度?例如,请看一下 图片: enter image description here

这是我的代码:

<?php
    $params = getimagesize($tempFile);
    $width = $params[0];
    $height = $params[1];

    $newwidth=150;
    $newheight= 150;
    $tmp=imagecreatetruecolor($newwidth,$newheight);

    imagecopyresampled($tmp,$src,0,0,0,0,$newwidth,$newheight,$width,$height);
    imagejpeg($tmp,$img_name,80);

    imagedestroy($src);
    imagedestroy($tmp); 
?>

有没有智能方法以智能方式调整图像大小? 感谢。

4 个答案:

答案 0 :(得分:2)

看起来twitpic是找出短轴有多长,然后取一个以原始图像为中心的正方形,边长等于短轴长度,然后将其缩小到150x150。

答案 1 :(得分:2)

有一个智能解决方案,它被称为 Seam Carving ,如果您的服务器支持ImageMagick,您可以这样做:

<?php
$im = new Imagick( 'image.jpg' );
$im->liquidRescaleImage( 600, 100, 3, 25 );
header( 'Content-Type: image/jpg' );
echo $im;
?>

或者,如果它不支持,请使用exec()(小心),以便将图像作为参数传递给可执行接缝雕刻的可执行文件。

它看起来像twitpic只是裁剪的平方图像提取。 在我之前的一个项目中,我使用了以下代码:

if ($image->width > $image->height){
    //crop image in proportions 4/3, then resize to 500x300 (or proportionally lower resolution), 
    //sharp it a little and decrease quality. 
    //I used one of the Yii framework extensions.
    $image->crop($image->width, $image->width/4*3)->resize(500, 300, Image::WIDTH)->sharpen(15)->quality(75);
}

答案 2 :(得分:0)

不,resmaple,只获得150x150像素的中心。

答案 3 :(得分:0)

您需要计算要复制的原始区域的适当坐标:

imagecopyresampled($tmp,$src,0,0,[THIS VALUE],[THIS VALUE],$newwidth,$newheight, [THIS VALUE],[THIS VALUE]);

截至目前,您将区域从0,0(x,y)移至原始区域的宽度,高度(x,y),并尝试将其限制为150x150。

您将需要计算哪个宽度和高度是“最大”并裁剪,并确保该比率与结果图像相同(在您的情况下,因为150x150,比率为1.0)。

在您的示例中,宽度为1050,高度为317像素,因此您希望原始图像的一部分为317x317(比率为1.0),您需要:

subtract 317 from 1050 = 733; // this is the excessive area for both sides
divide by 2 =~ 366; // to get the excessive area for one side

现在,使用第一个x坐标366,从左边开始366像素。 使用第二个x坐标1050 - 366从右侧开始366像素。

所以你的例子应该是(只是在这里猜测):

imagecopyresampled($tmp,$src,0,0,366,0,$newwidth,$newheight, $width - 366, 0);

您当然需要一些逻辑才能正确计算任何其他尺寸。