Üstten add_image_size () kırpmayı nasıl yapabilirim?


20

Hepsi öne çıkan görüntülere sahip bir dizi yayınım var, ancak kırpma sağ üst köşesini özelleştirebilmem gerekiyor. Bu örnekte, sağ üst kısımdan kırpılmalarına ihtiyacım var, ancak bu noktayı kendim nasıl konumlandıracağımı bilmek de yararlı olacaktır.

Şu anda, add_image_size () işlevi kırpmasını görüntünün merkezinden alıyor. Her zaman hoş değil !!

Yanıtlar:


13

Ara görüntü üretimi son derece katıdır. image_resize()kodu koda yakın tutar ve kancalardan tamamen yoksundur.

Bunun için hemen hemen tek seçenek, wp_generate_attachment_metadataWP tarafından oluşturulan görüntüyü kendinizle (üzerine biraz image_resize()çatal gerektirecek) kancalamak ve üzerine yazmaktır .

Daha sonra bazı kod paylaşmak mümkün böylece iş için bu gerekir.

Tamam, işte kaba ama çalışan bir örnek. Kırpmanın bu şekilde ayarlanmasının anlaşılmasını gerektirdiğini unutmayın 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
çekirdek ile karışıklık gibi geliyor !!
Hafif Fuzz

5
Hayır, çekirdeği karıştırmak image_resizeişlevi değiştirecekti . Rarst, yeniden boyutlandırma sürecine bağlanmak zorunda olduğunuz noktayı belirtiyordu, ancak görüntü boyutlarını kendiniz elle oluşturun.
TheDeadMedic

Bunun hala işe yarayıp yaramadığını sorabilir miyim? Kancayı benim function.php dosyasına uyguladım ve add_image_size () fonksiyonları ayarladım, ancak kırpılan görüntüler hala merkezden kırpılıyor.
cr0z3r

@ cr0z3r Neden işe yaramayacağını bilmiyorum. Ancak bunun anlamlı ve güvenilir koddan ziyade sadece kavram kanıtı örneği olduğuna dikkat edin.
Rarst

Hm, garip bir şekilde, benim tema üzerinde çalışmıyor - yerel olarak çalıştığı için olabilir (çok şüpheliyim)? Çevrimiçi olarak hazırlayacağım ve yakında size göstereceğim.
cr0z3r

13

Wordpress kodeksinin cevabı aşağıdadır.

Görüntüyü kırparak ve bir kırpma konumu tanımlayarak görüntü boyutunu ayarlayın:

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

Bir kırpma konumu ayarlanırken, dizideki ilk değer x ekseni kırpma konumudur, ikincisi y ekseni kırpma konumudur.

x_crop_position 'sol' 'merkez' veya 'sağ' kabul eder. y_crop_position 'üst', 'orta' veya 'alt' kabul eder. Varsayılan olarak, sert kırpma modunu kullanırken bu değerler varsayılan olarak 'orta' olur.

Ayrıca kodeks, kırpma konumlarının nasıl işlediğini gösteren bir sayfaya referans verir.

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


Bu harika, kabul edilen cevap olmalı bence!
Dalton

7

Bu soruna çekirdeği hacklemesini gerektirmeyen bir çözüm geliştirdim: http://bradt.ca/archives/image-crop-position-in-wordpress/

Çekirdeğe bir yama da gönderdim: http://core.trac.wordpress.org/ticket/19393

Çekirdeğe eklenebilmesi için desteğinizi göstermek üzere kendinizi bilete Cc olarak ekleyin.


2
@ Rarst'ın çözümü çekirdek dosyaları da değiştirmez. ;)
fuxia

1
@toscho Sanırım diğer cevabın çekirdek kodunu değiştirdiği anlamına gelmiyordu.
Kaiser


0

Alternatif çözüm burada: http://pixert.com/blog/cropping-post-featured-thumbnails-from-top-instead-of-center-in-wordpress-with-native-cropping-tool/

Bu kodu function.php dosyasına ekleyin, ardından "Küçük Resimleri Yeniden Oluştur" eklentisini kullanın ( 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 );

Merhaba Niente0, WPSE'ye hoş geldiniz ve cevabınız için teşekkür ederim. Kodunuzun ne yaptığını açıklamak için yayınınızı düzenler misiniz? StackExchange sitelerindeki gönderiler çözümlerini açıklamalı ve tüm çözümleri değil, yalnızca site dışı bağlantıları referans olarak içermelidir. Tekrar teşekkürler!
Tim Malone
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.