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

Php 将全景图像调整为固定大小,php,resize,Php,Resize,我想将图像调整为固定的宽度和高度(即150px)。但是,有一个问题,如果原始照片(例如全景照片)的高度和宽度存在很大差异,则调整大小的缩略图看起来很糟糕。是否有任何智能解决方案可以将照片调整为固定的宽度和高度?例如,请看一下这个 图片: 这是我的密码: <?php $params = getimagesize($tempFile); $width = $params[0]; $height = $params[1]; $newwidth=150;

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

有没有什么聪明的方法来调整图像的大小?
谢谢。

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

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

有一个聪明的解决方案,它被称为接缝雕刻,如果您的服务器支持ImageMagick,您可以这样做:

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

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

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像素

因此,您的示例应该是(仅在此处猜测):

当然,你需要一些逻辑来正确计算任何其他尺寸的图像。

好吧,(在我看来)TwitPic裁剪图像以便按比例缩小它。。。您可以通过获取“最大高度”和“最大宽度”来执行相同的操作,检查哪个较小,然后相应地裁剪另一个。在此之后,调整大小应该看起来像是
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
imagecopyresampled($tmp,$src,0,0,366,0,$newwidth,$newheight, $width - 366, 0);