Як я можу зробити обрізання add_image_size () зверху?


20

У мене є цілий ряд публікацій із усіма зображеними зображеннями, але мені потрібно вміти налаштувати обрізати верхній правий кут. У цьому випадку мені потрібно, щоб вони були обрізані зверху праворуч, але було б корисно також знати, як розташувати цю точку самостійно.

В даний час функція add_image_size () здійснює обрізку з центру зображення. Не завжди красива !!

Відповіді:


13

Проміжне генерування зображення надзвичайно жорстке. image_resize()тримає його близько до коду і повністю не має гачків.

Насправді єдиний варіант для цього - підключити wp_generate_attachment_metadataта перезаписати створене WP зображення своїм власним (для чого знадобиться трохи image_resize()вилки).

Мені це потрібно для роботи, тому я можу пізніше поділитися кодом.

Гаразд, ось приблизний, але робочий приклад. Зауважте, що налаштування врожаю таким чином вимагає розуміння 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
звучить багато, як возитися з ядром !!
Легкий фуз

5
Ні, возитися з ядром було б зміною image_resizeфункції. Rarst вказував на те, що вам доведеться зачепити процес зміни розміру, але створити розміри зображень самостійно вручну.
TheDeadMedic

Чи можу я запитати, чи це все-таки працює? Я щойно впровадив гачок у свій файл function.php, і я встановив функції add_image_size (), але обрізані зображення все ще обрізаються з центру.
cr0z3r

@ cr0z3r Я не знаю причин, чому це не буде працювати. Але зауважте, що це лише приблизний приклад підтвердження концепції, а не змістовний надійний код.
Рарст

Гм, як не дивно, це не працює на мою тему - це могло бути тому, що я бігав локально (я дуже сумніваюся в цьому)? У мене це буде в Інтернеті, і незабаром покажу його.
cr0z3r

13

Wordpress кодекс має відповідь, його нижче.

Встановіть розмір зображення, обрізаючи зображення та визначивши положення обрізання:

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

Під час встановлення положення обрізання першим значенням масиву є положення обрізання осі x, друге - положення обрізання по осі y.

x_crop_position приймає "зліва" "центр" або "праворуч". y_crop_position приймає "верх", "центр" або "знизу". За замовчуванням ці значення за замовчуванням становлять "центр", коли використовується режим жорсткого обрізання.

А також кодекс посилається на сторінку, яка показує, як діють позиції обрізання.

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


Це приголомшливо, я думаю, це має бути прийнята відповідь!
Далтон

7

Я розробив рішення цієї проблеми, яке не потребує злому ядра: http://bradt.ca/archives/image-crop-position-in-wordpress/

Я також подав патч до ядра: http://core.trac.wordpress.org/ticket/19393

Додайте себе в якості квитка на квиток, щоб показати свою підтримку, щоб його можна було додати до основної роботи.


2
@ Ріст Rarst також не змінює основні файли. ;)
фуксія

1
@toscho Я думаю, він не мав на увазі, що інша відповідь змінює основний код.
кайзер


0

Альтернативне рішення тут: http://pixert.com/blog/cropping-post-featured-thumbnails-from-top-instead-of-center-in-wordpress-with-native-cropping-tool/

Просто додайте цей код у function.php, а потім використовуйте плагін "Відновити мініатюри" ( 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 );

Привіт Niente0, ласкаво просимо до WPSE і дякуємо за вашу відповідь. Ви б не хотіли редагувати свій пост, щоб пояснити, що робить ваш код? Пости на сайтах StackExchange повинні пояснювати їх рішення та включати лише посилання на сторонні сайти як посилання, а не як цілі рішення. Знову дякую!
Тім Малоун
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.