it-swarm-vi.com

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

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 !!

20
Mild Fuzz

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 các hook.

Tùy chọn khá nhiều cho việc này là nối vào wp_generate_attachment_metadata và ghi đè lên hình ảnh do WP tạo bằng chính bạn (sẽ cần một chút của một ngã ba image_resize()).

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;
}
13
Rarst

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

10
ewroman

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

Tôi cũng đã gửi một bản vá cho 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.

7
bradt

Bạn có thể sử dụng plugin Thumbnail Crop Position để chọn vị trí cắt của hình thu nhỏ của bạn.

3
PoseLab

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 );
0
Niente0