2010-08-30 49 views
1

好吧,我以爲我明白這個功能,但我對這一個完整的心理障礙。imagecopy在PHP中進行採樣,有人可以解釋它嗎?

我想從800x536的照片創建大小75x75的裁剪縮略圖。

imagecopyresampled函數有10個可能的參數。我第一次嘗試這個:

// Starting point of crop 
     $tlx = floor(($width/2) - ($new_width/2)); //finds halfway point of big image and subtracts half of thumb. 
     $tly = floor(($height/2) - ($new_height/2)); //gets centre of image to be cropped. 

imagecopyresampled($tmp_img,$img,0,0,$tlx,$tly,$new_width,$new_height,$orig_width,$orig_height); 

這發現在大圖像的中途標記的任何一方,並裁剪出來。或者我想。但它實際上是作物的一部分圖片,並將右側和底部留在黑色(大概是從imagecreatetruecolor更早。

所以我找到了一種方法來做我想做的事但我想讓你解釋它是如何工作的。

我現在有:

//Create thumbnails. 
      $new_width = 75; //pixels. 
      $new_height = 75; 

      if($width > $height) $biggest_side = $width; 
      else $biggest_side = $height; 

      //The crop size will be half that of the largest side 
      $crop_percent = .5; 
      $crop_width = $biggest_side*$crop_percent; 
      $crop_height = $biggest_side*$crop_percent; 

      $c1 = array("x"=>($width-$crop_width)/2, "y"=>($height-$crop_height)/2); 

     //Create new image with new dimensions to hold thumb 
     $tmp_img = imagecreatetruecolor($new_width,$new_height); 

     //Copy and resample original image into new image. 
      imagecopyresampled($tmp_img,$img,0,0,$c1['x'],$c1['y'],$new_width,$new_height,$crop_width,$crop_height); 

這是完全這樣做,縮小圖像,然後裁剪出來的中間,但我的數學是不是很鋒利,還我認爲這絕對是我不充分了解imagecopyresampled功能。

有人可以通過它走過我嗎?參數按參數。特別是最後兩個。最初我輸入了原始圖像的寬度和高度,但是這會進入400和400(最長邊的一半)。對咆哮抱歉。希望我的心中明白這一點很快:)

亞歷

回答

16

這是相當簡單的,記錄here

參數:

1)$ dst_image和,表示要複製圖像的有效GD手柄INTO
2)$ src_image,一個有效的GD句柄,表示要複製的圖像從

3)$ dst_x - 要放置的目標圖像中的X偏移量Ë重採樣圖像到
4)$ dst_y - Y軸偏移,同上

5)$從src_x - X源圖像中的偏移,你要開始
6)$ src_y複製 - Y軸偏移,同上

7)$ dst_x - X在$ dst_image和新重新採樣的圖像的寬度
8)$ dst_y - ÿ寬度,同上

9)$從src_x - 的區域的X寬度複製出的$和src_image
10)$ src_y - Y寬度,同上

所以......

你已經有了一個$ src_image分別這是800x536,和$ dst_image和那75x75

 $width = 800        $new_width = 75 
+-----------------------+      +----+ 
|      |      | | 
|      |      | | $new_height = 75 
|      | $height = 536   +----+ 
|      | 
|      | 
+-----------------------+ 

聽起來像是你要取源圖像的​​中間塊,並作出從那個縮略圖,對吧?這中間的大塊應該代表原始圖像的高度&寬度的一半,所以你想:

$start_X = floor($width/4); // 200 
$width_Y = floor($height/4); // 134 

    200  400  200  
+-----------------------+ 
|  |   |  | 134 
|-----+----------+------| 
|  | This part|  | 268 
|-----+----------+------| 
|  |   |  | 134 
+-----------------------+ 

$end_x = $start_X + (2 * $start_x) // 3 * $start_x = 600 
$end_y = $start_Y + (2 * $start_y) // 3 * $start_y = 402 

imagecopyresampled($src, $dst, 0, 0, $startX, $start_y, 75, 75, $end_x, $end_y); 
           a b c  d   e f g  h 

A,B - 開始粘貼新圖像到左上的目標圖像
C,d的 - 開始在200134
Ë吸吮像素出原始圖像的,F - 使調整後的圖像75x75(填滿縮略圖)
G,H - 原始圖像現在

在停止複製像素爲600x402,這是假設你想讓縮略圖完全填滿。如果你想讓源圖像按比例縮小(因此它與原始圖像具有相同的高度/寬度比率,那麼你將不得不做一些數學來調整參數a,be,f

+0

哇非常感謝。因此,您使用end_x和end_y參數作爲停止座標,當手冊(我已經看了很多)說明它是寬度和高度時現在,我現在使用的是,在end_x和end_y中工作的是400x400,所以這意味着它需要從中心切出400x400,然後縮小到75x75? – 2010-08-30 23:59:43

+0

,當它顯示end_x/end_y的「源圖像」時,它就是您想要工作的源圖像的PIECE的結尾用。如果你想縮小整個圖像,那麼它就是原始圖像的高度/寬度。否則,它只是您正在切出的塊的高度/寬度。 – 2010-08-31 01:00:00

+0

對,我即將縮小整個圖像的400片400片,然後取出中間75x75平方米的圖像?我想我明白了。好哇! – 2010-08-31 01:41:29