Làm cách nào tôi có thể tạo add_image_size () crop từ đầu?


20

Tôi có một loạt bài viết, tất cả đều có hình ảnh đặc trưng, ​​nhưng tôi cần có thể tùy chỉnh crop top góc phải. Trong trường hợp này, tôi cần chúng được cắt từ trên cùng bên phải, nhưng cũng hữu ích khi biết cách xác định vị trí đó.

Hiện tại, hàm add_image_size () đang lấy crop từ trung tâm của hình ảnh. Không phải lúc nào cũng xinh đẹp !!

Câu trả lời:


13

Tạo hình ảnh trung gian là vô cùng cứng nhắc. image_resize()giữ cho nó gần với mã và hoàn toàn thiếu móc.

Khá nhiều lựa chọn duy nhất cho việc này là nối vào wp_generate_attachment_metadatavà ghi đè lên hình ảnh do WP tạo bằng chính bạn (sẽ cần một chútimage_resize() ngã ba).

Tôi cần điều này cho công việc để tôi có thể chia sẻ một số mã sau này.

Ok, đây là thô, nhưng ví dụ làm việc. Lưu ý rằng thiết lập crop theo cách này đòi hỏi sự hiểu biết về imagecopyresampled().

add_filter('wp_generate_attachment_metadata', 'custom_crop');

function custom_crop($metadata) {

    $uploads = wp_upload_dir();
    $file = path_join( $uploads['basedir'], $metadata['file'] ); // original image file
    list( $year, $month ) = explode( '/', $metadata['file'] );
    $target = path_join( $uploads['basedir'], "{$year}/{$month}/".$metadata['sizes']['medium']['file'] ); // intermediate size file
    $image = imagecreatefromjpeg($file); // original image resource
    $image_target = wp_imagecreatetruecolor( 44, 44 ); // blank image to fill
    imagecopyresampled($image_target, $image, 0, 0, 25, 15, 44, 44, 170, 170); // crop original
    imagejpeg($image_target, $target, apply_filters( 'jpeg_quality', 90, 'image_resize' )); // write cropped to file

    return $metadata;
}

1
Nghe có vẻ giống như làm hỏng lõi !!
Fuzz nhẹ

5
Không, lộn xộn với lõi sẽ thay đổi image_resizechức năng. Rarst đã đưa ra quan điểm rằng bạn phải tham gia vào quá trình thay đổi kích thước, nhưng tự tạo kích thước hình ảnh theo cách thủ công.
TheDeadMote

Tôi có thể hỏi nếu điều này vẫn còn hoạt động? Tôi vừa thực hiện hook vào tệp tin.php của mình và tôi đã thiết lập các hàm add_image_size (), nhưng các hình ảnh được cắt vẫn bị cắt xén ở giữa.
cr0z3r

@ cr0z3r Tôi không biết lý do tại sao nó không hoạt động. Nhưng lưu ý rằng đây chỉ là ví dụ bằng chứng khái niệm thô chứ không phải là mã đáng tin cậy có ý nghĩa.
Hết

Hừm, thật kỳ lạ, nó không hoạt động theo chủ đề của tôi - có thể là do tôi đang chạy cục bộ (tôi rất nghi ngờ điều đó)? Tôi sẽ có nó trực tuyến và hiển thị cho bạn sớm.
cr0z3r

13

Wordpress codex có câu trả lời, bên dưới.

Đặt kích thước hình ảnh bằng cách cắt xén hình ảnh và xác định vị trí cắt:

add_image_size( 'custom-size', 220, 220, array( 'left', 'top' ) ); // Hard crop left top

Khi đặt vị trí cắt, giá trị đầu tiên trong mảng là vị trí cắt trục x, thứ hai là vị trí cắt trục y.

x_crop_poseition chấp nhận 'trái' 'trung tâm' hoặc 'phải'. y_crop_poseition chấp nhận 'trên cùng', 'trung tâm' hoặc 'dưới cùng'. Theo mặc định, các giá trị này mặc định là 'trung tâm' khi sử dụng chế độ cắt cứng.

Và codex cũng tham chiếu một trang cho biết cách thức hoạt động của các vị trí cắt.

http://havecamerawilltravel.com/phOWN/wordpress-thumbnail-crop


Điều này thật tuyệt vời, nên là câu trả lời được chấp nhận, tôi nghĩ vậy!
Dalton

7

Tôi đã phát triển một giải pháp cho vấn đề này mà không yêu cầu hack lõi: http://bradt.ca/archives/image-crop-poseition-in-wordpress/

Tôi cũng đã gửi một bản vá cho cốt lõi: http://core.trac.wordpress.org/ticket/19393

Thêm chính bạn là một Cc trên vé để thể hiện sự hỗ trợ của bạn cho nó được thêm vào cốt lõi.


2
Giải pháp của @ Rarst cũng không thay đổi tập tin cốt lõi. ;)
fuxia

1
@toscho Tôi đoán anh ấy không có nghĩa là câu trả lời khác thay đổi mã lõi.
kaiser


0

Giải pháp thay thế tại đây: http://pixert.com/blog/cropping-post-featured-thumbnails-from-top-instead-of-center-in-wordpress-with-native-cropping-tool/

Chỉ cần thêm mã này vào hàm.php, sau đó sử dụng plugin "Tái tạo hình thu nhỏ" ( https://wordpress.org/plugins/regenerate-thumbnails/ ):

function px_image_resize_dimensions( $payload, $orig_w, $orig_h, $dest_w, $dest_h, $crop ){

// Change this to a conditional that decides whether you want to override the defaults for this image or not.
if( false )
return $payload;

if ( $crop ) {
// crop the largest possible portion of the original image that we can size to $dest_w x $dest_h
$aspect_ratio = $orig_w / $orig_h;
$new_w = min($dest_w, $orig_w);
$new_h = min($dest_h, $orig_h);

if ( !$new_w ) {
$new_w = intval($new_h * $aspect_ratio);
}

if ( !$new_h ) {
$new_h = intval($new_w / $aspect_ratio);
}

$size_ratio = max($new_w / $orig_w, $new_h / $orig_h);

$crop_w = round($new_w / $size_ratio);
$crop_h = round($new_h / $size_ratio);

$s_x = 0; // [[ formerly ]] ==> floor( ($orig_w - $crop_w) / 2 );
$s_y = 0; // [[ formerly ]] ==> floor( ($orig_h - $crop_h) / 2 );
} else {
// don't crop, just resize using $dest_w x $dest_h as a maximum bounding box
$crop_w = $orig_w;
$crop_h = $orig_h;

$s_x = 0;
$s_y = 0;

list( $new_w, $new_h ) = wp_constrain_dimensions( $orig_w, $orig_h, $dest_w, $dest_h );
}

// if the resulting image would be the same size or larger we don't want to resize it
if ( $new_w >= $orig_w && $new_h >= $orig_h )
return false;

// the return array matches the parameters to imagecopyresampled()
// int dst_x, int dst_y, int src_x, int src_y, int dst_w, int dst_h, int src_w, int src_h
return array( 0, 0, (int) $s_x, (int) $s_y, (int) $new_w, (int) $new_h, (int) $crop_w, (int) $crop_h );

}
add_filter( 'image_resize_dimensions', 'px_image_resize_dimensions', 10, 6 );

Xin chào Niente0, chào mừng bạn đến với WPSE và cảm ơn bạn đã trả lời. Bạn có phiền khi chỉnh sửa bài viết của mình để giải thích mã của bạn làm gì không? Các bài đăng trên các trang web StackExchange nên giải thích giải pháp của họ và chỉ bao gồm các liên kết ngoài trang web làm tài liệu tham khảo, không phải là toàn bộ giải pháp. Cảm ơn một lần nữa!
Tim Malone
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.