ฉันจะเพิ่มการครอบตัด 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
ฟังดูคล้ายกับล้อเล่นกับแกน !!
Mild Fuzz

5
ไม่ยุ่งกับแกนจะเปลี่ยนimage_resizeฟังก์ชั่น Rarst ทำให้ประเด็นที่คุณต้องขอเข้าสู่กระบวนการปรับขนาด แต่สร้างขนาดภาพด้วยตนเอง
TheDeadMedic

ฉันขอถามได้ไหมว่าสิ่งนี้ยังใช้ได้อยู่หรือไม่ ฉันเพิ่งใช้เบ็ดลงในไฟล์ functions.php ของฉันและฉันมีการตั้งค่าฟังก์ชั่น add_image_size () แต่ภาพที่ครอบตัดยังคงถูกครอบตัดอยู่ตรงกลาง
cr0z3r

@ cr0z3r ฉันรู้ว่าไม่มีเหตุผลว่าทำไมมันไม่ทำงาน แต่โปรดทราบว่านี่เป็นเพียงตัวอย่างการพิสูจน์แนวคิดคร่าวๆมากกว่ารหัสที่เชื่อถือได้ที่มีความหมาย
Rarst

อืมแปลกมากพอมันใช้งานไม่ได้กับธีมของฉัน - อาจเป็นเพราะฉันใช้งานในพื้นที่ (ฉันสงสัยอย่างมาก)? ฉันจะทำให้มันออนไลน์และแสดงให้คุณเห็นในไม่ช้า
cr0z3r

13

Wordpress codex มีคำตอบข้างล่างนี้

กำหนดขนาดภาพโดยการครอบตัดรูปภาพและกำหนดตำแหน่งครอบตัด:

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

เมื่อตั้งค่าตำแหน่งการครอบตัดค่าแรกในอาร์เรย์คือตำแหน่งการครอบตัดแกน x ส่วนที่สองคือตำแหน่งการครอบตัดแกน y

x_crop_position ยอมรับ 'left' 'center' หรือ 'right' y_crop_position ยอมรับ 'top', 'center' หรือ 'bottom' ตามค่าเริ่มต้นค่าเหล่านี้จะเป็น 'ศูนย์' เมื่อใช้โหมดการครอบตัดแบบยาก

และ codex อ้างอิงหน้าซึ่งแสดงให้เห็นว่าตำแหน่งการครอบตัดทำงานอย่างไร

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


น่ากลัวน่าจะเป็นคำตอบที่ยอมรับได้ฉันคิดว่า!
Dalton

7

ฉันได้พัฒนาวิธีแก้ปัญหาที่ไม่ต้องแฮ็คคอร์: http://bradt.ca/archives/image-crop-position-in-wordpress/

ฉันได้ส่งแพทช์ให้กับคอร์ด้วย: http://core.trac.wordpress.org/ticket/19393

เพิ่มตัวคุณเองเป็น Cc บนตั๋วเพื่อแสดงการสนับสนุนของคุณเพื่อเพิ่มเข้าไปในแกน


2
วิธีการแก้ปัญหาของ @Rarst ไม่ได้เปลี่ยนไฟล์หลักเช่นกัน ;)
fuxia

1
@ เทาฉันเดาว่าเขาไม่ได้หมายความว่าคำตอบอื่นเปลี่ยนรหัสหลัก
ไกเซอร์


0

โซลูชันทางเลือกที่นี่: http://pixert.com/blog/cropping-post-featured-thumbnails-from-top-instead-of-center-in-wordpress-with-native-cropping-tool/

เพียงแค่เพิ่มรหัสนี้ลงใน functions.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 ควรอธิบายวิธีแก้ไขปัญหาของตนเองและรวมเฉพาะลิงก์นอกสถานที่เป็นข้อมูลอ้างอิงไม่ใช่โซลูชันทั้งหมด ขอบคุณอีกครั้ง!
ทิมมาโลน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.