Bagaimana saya bisa membuat crop add_image_size () dari atas?

20

Saya memiliki serangkaian posting, semua dengan gambar yang ditampilkan, tetapi saya harus dapat menyesuaikan sudut kanan atas krop. Dalam hal ini, saya perlu mereka dipotong dari kanan atas, tetapi akan berguna juga untuk mengetahui bagaimana posisi titik itu sendiri.

Saat ini, fungsi add_image_size () mengambil pemangkasannya dari tengah gambar. Tidak selalu cantik !!

Fuzz Ringan
sumber

Jawaban:

13

Generasi gambar menengah sangat kaku. image_resize()tetap dekat dengan kode dan benar-benar tidak memiliki kait.

Cukup banyak pilihan untuk ini adalah menghubungkan ke wp_generate_attachment_metadatadan menimpa gambar WP-dihasilkan dengan Anda sendiri (yang akan memerlukan sedikit image_resize()garpu).

Saya membutuhkan ini untuk bekerja sehingga saya mungkin dapat membagikan beberapa kode nanti.

Ok, ini kasar, tapi contoh kerjanya. Perhatikan bahwa menyiapkan pemangkasan dengan cara ini membutuhkan pemahaman 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;
}
Jarang
sumber
1
Kedengarannya seperti mengacaukan inti !!
Mild Fuzz
5
Tidak, mengacaukan inti akan mengubah image_resizefungsinya. Rarst menyatakan bahwa Anda harus terhubung ke proses pengubahan ukuran, tetapi buat sendiri ukuran gambar secara manual.
TheDeadMedic
Bolehkah saya bertanya apakah ini masih berfungsi? Saya baru saja mengimplementasikan hook ke dalam file functions.php saya dan saya memiliki set-up fungsi add_image_size (), tetapi gambar yang dipangkas masih dipotong dari bagian tengah.
cr0z3r
@ cr0z3r Saya tidak tahu alasan mengapa itu tidak akan berhasil. Tetapi perhatikan bahwa ini hanyalah contoh bukti konsep yang kasar, daripada kode yang dapat diandalkan yang bermakna.
Paling lambat
Hm, anehnya, itu tidak berfungsi pada tema saya - mungkinkah karena saya berjalan secara lokal (saya sangat meragukannya)? Saya akan membuatnya online dan menunjukkannya kepada Anda segera.
cr0z3r
13

Kodeks Wordpress memiliki jawabannya, di bawah ini.

Tetapkan ukuran gambar dengan memotong gambar dan menentukan posisi pemotongan:

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

Saat mengatur posisi pemotongan, nilai pertama dalam array adalah posisi pemotongan sumbu x, yang kedua adalah posisi pemotongan sumbu y.

x_crop_position menerima 'kiri' 'tengah', atau 'kanan'. y_crop_position menerima 'atas', 'tengah', atau 'bawah'. Secara default, nilai-nilai ini default ke 'tengah' saat menggunakan mode krop keras.

Dan juga referensi codex halaman yang menunjukkan bagaimana posisi posisi bekerja.

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

ewroman
sumber
Ini luar biasa, harusnya jawaban yang diterima, saya pikir!
Dalton
7

Saya telah mengembangkan solusi untuk masalah ini yang tidak memerlukan peretasan inti: http://bradt.ca/archives/image-crop-position-in-wordpress/

Saya juga telah mengirimkan tambalan ke inti: http://core.trac.wordpress.org/ticket/19393

Tambahkan diri Anda sebagai Cc di tiket untuk menunjukkan dukungan Anda agar dapat ditambahkan ke inti.

bradt
sumber
2
Solusi @ Rarst tidak mengubah file inti juga. ;)
fuxia
1
@toscho Saya kira dia tidak bermaksud bahwa jawaban yang lain mengubah kode inti.
kaiser
3

Anda dapat menggunakan plugin Thumbnail Crop Position untuk memilih posisi memotong thumbnail Anda.

PoseLab
sumber
0

Solusi alternatif di sini: http://pixert.com/blog/cropping-post-featured-thumbnails-dari-dari-dari-dari-pusat-di-wordpress-dengan-native-cropping-tool/

Cukup tambahkan kode ini ke functions.php, lalu gunakan plugin "Regenerate Thumbnails" ( 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
sumber
Halo Niente0, selamat datang di WPSE dan terima kasih atas jawaban Anda. Maukah Anda mengedit posting Anda untuk menjelaskan apa yang kode Anda lakukan? Posting di situs StackExchange harus menjelaskan solusinya, dan hanya menyertakan tautan di luar sebagai referensi, bukan sebagai keseluruhan solusi. Terima kasih lagi!
Tim Malone