2011-07-31 37 views
10

Tôi muốn cắt ảnh từ trung tâm có kích thước 200 * 130 ảnh sẽ bị cắt có thể khác nhau về kích thước, nếu ảnh nhỏ hơn, chúng tôi sẽ không cắt nó, tôi biết phần này ở đâu có thể kiểm tra chiều cao và với hình ảnh nhưng loại tấn công vào việc cắt xén từ giữa hình ảnh Vì tôi không thể tìm ra cách giữ trung tâm như điểm cắt và hơn cắt ra ngoài nóCắt ảnh từ Trung tâm PHP

Trả lời

31

GD đi kèm với tất cả các cài đặt PHP từ phiên bản 4.3.6 trở đi, rất có thể, bạn có nó.

Dưới đây là các bước bạn cần phải thực hiện ...

  1. Tạo một tài nguyên hình ảnh bằng một trong những chức năng GD imagecreatefrom*(). Các bạn sử dụng phụ thuộc vào loại hình ảnh bạn đang làm việc với
  2. Xác định kích thước hình ảnh sử dụng imagesx()imagesy()
  3. Xác định cây trồng của bạn phối bằng cách sử dụng thuật toán và cây trồng sau đây sử dụng imagecopy()

Tìm tọa độ cây trồng

$width = imagesx($img); 
$height = imagesy($img); 
$centreX = round($width/2); 
$centreY = round($height/2); 

$cropWidth = 200; 
$cropHeight = 130; 
$cropWidthHalf = round($cropWidth/2); // could hard-code this but I'm keeping it flexible 
$cropHeightHalf = round($cropHeight/2); 

$x1 = max(0, $centreX - $cropWidthHalf); 
$y1 = max(0, $centreY - $cropHeightHalf); 

$x2 = min($width, $centreX + $cropWidthHalf); 
$y2 = min($height, $centreY + $cropHeightHalf); 

hãy sử dụng lớp xử lý ảnh của tôi, nó nên làm cho một số khía cạnh dễ dàng hơn nhiều - https://gist.github.com/880506

$im = new ImageManipulator('/path/to/image'); 
$centreX = round($im->getWidth()/2); 
$centreY = round($im->getHeight()/2); 

$x1 = $centreX - 100; 
$y1 = $centreY - 65; 

$x2 = $centreX + 100; 
$y2 = $centreY + 65; 

$im->crop($x1, $y1, $x2, $y2); // takes care of out of boundary conditions automatically 
$im->save('/path/to/cropped/image'); 
+1

Mũ tắt, điều đó thật tuyệt vời và hoạt động xuất sắc.THanks – June

+0

Trong thuật toán đầu tiên, các biến nào sẽ tương ứng với các tham số chính xác của imagecopy()? –

+0

@ChrisHarrison Xem https://gist.github.com/philBrown/880506#file-imagemanipulator-php-L185 – Phil

0

Điều này có thể giúp bạn .

function cropCentered($img, $w, $h) 
{ 
    $cx = $img->getWidth()/2; 
    $cy = $img->getHeight()/2; 
    $x = $cx - $w/2; 
    $y = $cy - $h/2; 
    if ($x < 0) $x = 0; 
    if ($y < 0) $y = 0; 
    return $img->crop($x, $y, $w, $h); 
} 

Tôi giả sử bạn đang sử dụng thư viện GD. $ img là hình ảnh GD, $ w và $ h là chiều rộng và chiều cao, tương ứng, bạn muốn hình ảnh mới của mình có. Trong trường hợp của bạn, $ w = 200, $ h = 130.

+0

Không, tôi không có thư viện GD có sẵn với tôi – June

+1

@June GD được bao gồm trong hầu hết các cài đặt php, sử dụng 'phpinfo() 'và bạn rất có thể thấy nó –

+0

Bạn có thể giúp tôi trong việc tạo ở trên với Thư viện GD không và lưu hình ảnh? – June

1

Jeez, tại sao bạn làm điều đó một cách khó khăn? Chỉ đơn giản là thiết lập các vị trí x và y như số tiền để cắt thông báo/2

$imageSize = getimagesize('thumbnail.png'); 

$croppedImage = imagecrop(imagecreatefrompng('thumbnail.png'), ['x' => 0, 'y' => ($imageSize[1]-$imageSize[0]*(9/16))/2, 'width' => $imageSize[0], 'height' => $imageSize[0]*(9/16)]); 

làm thế nào tôi sử dụng tôi $ ImageSize [0] * (9/16), là số tiền tôi đang cắt xén bởi trong y hướng, và tôi trừ rằng từ chiều cao hình ảnh ban đầu để tìm số lượng cây trồng, sau đó chia cho 2. Nếu bạn muốn làm tương tự cho chiều rộng, chỉ cần làm theo các bước tương tự.

Các vấn đề liên quan