我想将图像调整为固定的宽度和高度(即150px)。然而,问题是,如果原始照片的高度和宽度存在很大差异(例如,全景照片),则调整大小的缩略图看起来很糟糕。有没有任何智能解决方案可以将照片调整到固定的宽度和高度?例如,请看一下 图片:
这是我的代码:
<?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);
?>
有没有智能方法以智能方式调整图像大小? 感谢。
答案 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);
您当然需要一些逻辑才能正确计算任何其他尺寸。