2017-05-29 40 views
1

我正在嘗試製作一個Web應用程序,該應用程序擁有一個管理網站,您可以在其中上傳圖像。我已經在使用imagecopy()來製作方形照片。但是當圖片太大時,我正嘗試用imagecopyresized()調整大小。我已經使用這個代碼:imagecopy調整大小問題PHP

$file = $_FILES['img']['tmp_name']; 
$filename = $_FILES['img']['name']; 
$size = 400; 
$destino = imagecreatetruecolor($size, $size); 
list($width, $height) = getimagesize($file); 
$correction = $size/2; 
$widths = $width/2 - $correction; 
$heights = $height/2 - $correction; 
$origen = imagecreatefromjpeg($file); 
$overflow = $size + 200; 

if($width > $overflow){ 
    $modified = $origen; 
    $ratio = $width/$height; 
    $growth = $width/$overflow; 
    $final = $overflow/$growth; 
    if($ratio > 1){ 
     $newwidth = $final * $ratio; 
    }else{ 
     $newwidth = $final/$ratio; 
    } 
    imagecopyresized($origen, $modified, 0, 0, 0, 0, $final, $newwidth, $width, $height); 
} 
imagecopy($destino, $origen, 0, 0, $widths, $heights, $size, $size); 

的這裏的問題是,有沒有修改是大於$overflow圖像。

$ratio是保留照片的原始尺寸並防止變形。

$growth是一個索引,雖然圖像越大,它將被複制的最小。

$final是以增長指數作爲計數的最終寬度。

回答

1

您對PHP如何處理資源以及GD函數的工作方式做了一些不正確的假設。

$modified = $origen; 

上面一行給你兩個獨立的圖像資源;它給你兩個指向內存中相同圖像資源的變量。這意味着任何一項操作都會反映在另一項中。

這會導致你做出兩個錯誤有以下行:

imagecopyresized($origen, $modified, 0, 0, 0, 0, $final, $newwidth, $width, $height); 
  1. 此功能不調整目標圖像($origen)或源圖像($modified);它會調整從源圖像複製的圖像部分(即代碼中$modified的指定部分)。
  2. 因爲$origen$modified指向同一資源的功能粘貼圖像的尺寸調整後的副本上其本身上,像這樣:

    moaning lisa doubled

最後你撥打:

imagecopy($destino, $origen, 0, 0, $widths, $heights, $size, $size); 

這裏的一個問題是$widths$heights都是在之前計算的調整大小,但實際上問題隱藏,因爲(如上所述)$origen未調整大小!

的所有上述結果是給你從原始圖像的中間「一刀切」,像這樣的廣場:

moaning lisa squared

這是我會怎麼調整輸入圖像以適合內400x400px和中心它的輸出:

$file = $_FILES['img']['tmp_name']; 

$maxW = $maxH = 400; 
list($srcW, $srcH) = getimagesize($file); 
$ratio = $srcW/$srcH; 

$src = imagecreatefromjpeg($file); 
$dest = imagecreatetruecolor($maxW, $maxH); 

if ($ratio > 1) { 
    // landscape. 
    $destH = ($maxH/$ratio); 
    imagecopyresized($dest, $src, 0, ($maxH/2) - ($destH/2), 0, 0, $maxW, $destH, $srcW, $srcH); 
} else { 
    // portrait (or square). 
    $destW = ($maxW * $ratio); 
    imagecopyresized($dest, $src, ($maxW/2) - ($destW/2), 0, 0, 0, $destW, $maxH, $srcW, $srcH); 
} 
// now do whatever you want with $dest... 

注意,這將導致在輸出的頂部/底部(的景觀形象)或左/右(肖像圖像)的黑條。您可以在調用imagecopyresized之前用顏色或透明度填充$dest以更改此設置。

+0

哇!你救了我的命!謝謝! –