2011-03-01 110 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); 

你當然會需要一些邏輯,以便爲任何其他大小正確計算此。