2011-03-01 86 views
2

我想将图像大小调整为固定的宽度和高度(即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); 
?> 

是否有调整的智能方式将图像任何聪明的办法? 谢谢。

+0

那么,(在我看来)TwitPic会裁剪图像以便按比例缩小比例...您可以通过获取最大高度和最大宽度来检查哪一个比较小,并相应裁剪另一个。在此之后,调整大小应该看起来很好 – acm 2011-03-01 17:27:16

+0

可能重复的[调整大小的图片到一个固定的大小](http://stackoverflow.com/questions/747101/resize-a-picture-to-a-fixed-size) – 2011-03-10 11:02:49

回答

2

有一个聪明的解决方案,这就是所谓的缝隙拼接,如果你的服务器支持的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

它看起来像twitpic是发现短轴多长,然后取一个正方形集中在原始图像的边长等于短轴长度,然后收缩到150x150。

0

不,resmaple,得到只有中心150x150像素。

0

你需要计算相应的坐标,你要复制的原始面积:

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

截至目前,你拿从0,0(x,y)到原始区域的宽度,高度(x,y)的区域,并尝试将其抽成150x150。

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

在您的例子,其中宽度是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); 

你当然会需要一些逻辑,以便为任何其他大小正确计算此。