2013-08-19 39 views
11

Tôi sử dụng imagick cho hình thu nhỏ, nhưng đôi khi hình thu nhỏ bị cắt thiếu phần trên cùng của hình ảnh (tóc, mắt).làm thế nào để tôi sử dụng imagick trong php? (thay đổi kích thước và cắt)

Tôi đã suy nghĩ để thay đổi kích thước hình ảnh rồi cắt hình ảnh đó. Ngoài ra, tôi cần phải giữ tỷ lệ kích thước hình ảnh.

Dưới đây là kịch bản php tôi sử dụng cho cây trồng:

$im = new imagick("img/20130815233205-8.jpg"); 
$im->cropThumbnailImage(80, 80); 
$im->writeImage("thumb/th_80x80_test.jpg"); 
echo '<img src="thumb/th_80x80_test.jpg">'; 

Cảm ơn ..

+0

Bạn gặp phải lỗi gì? Sản lượng dự kiến ​​là gì? Phiên bản PHP nào? là imagick được cài đặt? Chi tiết xin vui lòng ... –

+1

Không, đây không phải là lỗi. imagick hoạt động tốt. Kịch bản trên chỉ thực hiện cắt xén. Tôi muốn RESIZE đầu tiên, sau đó tôi muốn cắt nó, vì vậy tôi đang thiếu bước đầu tiên .. – newworroo

+0

Vâng, hãy gọi 'imageResize' trước, sau đó ... –

Trả lời

22

Nhiệm vụ này không phải là dễ dàng như phần "quan trọng" có thể không luôn luôn được ở cùng một chỗ. Tuy nhiên, sử dụng một cái gì đó như thế này

$im = new imagick("c:\\temp\\523764_169105429888246_1540489537_n.jpg"); 
$imageprops = $im->getImageGeometry(); 
$width = $imageprops['width']; 
$height = $imageprops['height']; 
if($width > $height){ 
    $newHeight = 80; 
    $newWidth = (80/$height) * $width; 
}else{ 
    $newWidth = 80; 
    $newHeight = (80/$width) * $height; 
} 
$im->resizeImage($newWidth,$newHeight, imagick::FILTER_LANCZOS, 0.9, true); 
$im->cropImage (80,80,0,0); 
$im->writeImage("D:\\xampp\\htdocs\\th_80x80_test.jpg"); 
echo '<img src="th_80x80_test.jpg">'; 

(thử nghiệm)

nên làm việc. Các tham số cropImage (0 và 0) xác định góc trên bên trái của vùng cắt. Vì vậy, chơi với những cung cấp cho bạn differnt kết quả của những gì nằm trong hình ảnh.

+1

Cảm ơn bạn !!! Nó hoàn hảo .. – newworroo

1

Dựa trên Martin's answer tôi đã thực hiện một chức năng tổng quát hơn mà thay đổi kích thước và cây trồng Imagick hình ảnh để phù hợp với chiều rộng nhất định và chiều cao (ví dụ: cư xử chính xác như khai CSS background-size: cover):

/** 
* Resizes and crops $image to fit provided $width and $height. 
* 
* @param \Imagick $image 
* Image to change. 
* @param int $width 
* New desired width. 
* @param int $height 
* New desired height. 
*/ 
function image_cover(Imagick $image, $width, $height) { 
    $ratio = $width/$height; 

    // Original image dimensions. 
    $old_width = $image->getImageWidth(); 
    $old_height = $image->getImageHeight(); 
    $old_ratio = $old_width/$old_height; 

    // Determine new image dimensions to scale to. 
    // Also determine cropping coordinates. 
    if ($ratio > $old_ratio) { 
    $new_width = $width; 
    $new_height = $width/$old_width * $old_height; 
    $crop_x = 0; 
    $crop_y = intval(($new_height - $height)/2); 
    } 
    else { 
    $new_width = $height/$old_height * $old_width; 
    $new_height = $height; 
    $crop_x = intval(($new_width - $width)/2); 
    $crop_y = 0; 
    } 

    // Scale image to fit minimal of provided dimensions. 
    $image->resizeImage($new_width, $new_height, imagick::FILTER_LANCZOS, 0.9, true); 

    // Now crop image to exactly fit provided dimensions. 
    $image->cropImage($new_width, $new_height, $crop_x, $crop_y); 
} 

Hy vọng điều này có thể giúp ai đó.

+1

'' imagick :: FILTER_LANCZOS'' phải là '' \ Imagick :: FILTER_LANCZOS'' –

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