2016-02-09 140 views
1

我想將圖像大小調整爲正方形。假設我想要一個500x500的平方圖像,並且我有一個300x600的圖像 我想將圖像大小調整爲200x500,然後爲其添加白色背景以使其成爲500x500調整圖像大小 - 保持比例 - 添加白色背景

我通過這樣做了一些很好的工作:

$TargetImage = imagecreatetruecolor(300, 600); 
imagecopyresampled(
    $TargetImage, $SourceImage, 
    0, 0, 
    0, 0, 
    300, 600, 
    500, 500 
); 
$final = imagecreatetruecolor(500, 500); 
$bg_color = imagecolorallocate ($final, 255, 255, 255) 
imagefill($final, 0, 0, $bg_color); 
imagecopyresampled(
    $final, $TargetImage, 
    0, 0, 
    ($x_mid - (500/ 2)), ($y_mid - (500/ 2)), 
    500, 500, 
    500, 500 
); 

它幾乎所有事情都做對了。圖片集中在一切。除了背景是黑色而不是白色:/

任何人都知道我在做什麼錯了?

picture

+0

據我所知,這不能用PHP來完成。 –

+0

您可能需要使用像[imagemagick](http://php.net/manual/en/intro.imagick.php)這樣的擴展名。特別是如果其他附加圖像操作在地平線上。 –

+0

您能提供原始圖像寬度/高度,'$ Width' /'$ Height'和'$ FinalWidth' /'$ FinalHeight'的真實世界值嗎? – maxhb

回答

4

我想這是你想要的東西:

<?php 
    $square=500; 

    // Load up the original image 
    $src = imagecreatefrompng('original.png'); 
    $w = imagesx($src); // image width 
    $h = imagesy($src); // image height 
    printf("Orig: %dx%d\n",$w,$h); 

    // Create output canvas and fill with white 
    $final = imagecreatetruecolor($square,$square); 
    $bg_color = imagecolorallocate ($final, 255, 255, 255); 
    imagefill($final, 0, 0, $bg_color); 

    // Check if portrait or landscape 
    if($h>=$w){ 
     // Portrait, i.e. tall image 
     $newh=$square; 
     $neww=intval($square*$w/$h); 
     printf("New: %dx%d\n",$neww,$newh); 
     // Resize and composite original image onto output canvas 
     imagecopyresampled(
     $final, $src, 
     intval(($square-$neww)/2),0, 
     0,0, 
     $neww, $newh, 
     $w, $h); 
    } else { 
     // Landscape, i.e. wide image 
     $neww=$square; 
     $newh=intval($square*$h/$w); 
     printf("New: %dx%d\n",$neww,$newh); 
     imagecopyresampled(
     $final, $src, 
     0,intval(($square-$newh)/2), 
     0,0, 
     $neww, $newh, 
     $w, $h); 
    } 

    // Write result 
    imagepng($final,"result.png"); 
?> 

還要注意,如果你想縮小爲300x600以適應500×500,同時保持縱橫比,你會得到250x500不是200×500 。

+0

這適用於垂直站立的圖像。但是如果我將圖像水平放置,則圖像會垂直「擠壓」。 – odannyc

+0

好吧,我現在不在我的電腦上,但是現在你的白色背景尺寸合適,所以代碼是正確的,直到'imagecopyresampled()',是嗎?因此,我們需要獲得原始圖像的寬度和高度,並找出哪個更長,這很容易,然後我們相應地更改'imagecopyresampled()'的第2到第8個參數。如果你沒有解決問題,我明天就會做。 –

+0

請再試一次。 –