Jak mogę zrobić uprawę add_image_size () od góry?

20

Mam serię postów, wszystkie z polecanymi obrazami, ale muszę mieć możliwość dostosowania prawego górnego rogu. W tym przypadku potrzebuję ich przycięcia od prawego górnego rogu, ale dobrze byłoby też wiedzieć, jak sam ustawić ten punkt.

Obecnie funkcja add_image_size () pobiera kadr ze środka obrazu. Nie zawsze ładna !!

Łagodny Fuzz
źródło

Odpowiedzi:

13

Pośrednie generowanie obrazu jest wyjątkowo sztywne. image_resize()utrzymuje go blisko kodu i całkowicie brakuje haków.

Prawie jedyną opcją tego jest podpięcie się wp_generate_attachment_metadatai zastąpienie obrazu wygenerowanego przez WP własnym (który będzie wymagał trochę image_resize()rozwidlenia).

Potrzebuję tego do pracy, aby móc później udostępnić trochę kodu.

Ok, tu jest szorstki, ale działający przykład. Pamiętaj, że konfigurowanie uprawy w ten sposób wymaga zrozumienia 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;
}
Rarst
źródło
1
brzmi jak bałagan z rdzeniem !!
Łagodny Fuzz
5
Nie, bałagan z rdzeniem zmieniłby image_resizefunkcję. Rarst miał na myśli to, że trzeba będzie się przyłączyć do procesu zmiany rozmiaru, ale samodzielnie należy utworzyć rozmiary obrazu.
TheDeadMedic
Czy mogę zapytać, czy to nadal działa? Właśnie zaimplementowałem hook w moim pliku functions.php i mam skonfigurowane funkcje add_image_size (), ale przycięte obrazy wciąż są przycinane od środka.
cr0z3r,
@ cr0z3r Nie znam powodu, dla którego to nie zadziała. Należy jednak pamiętać, że jest to tylko przybliżony przykład weryfikacji koncepcji, a nie znaczący wiarygodny kod.
Rarst
Hm, o dziwo, to nie działa na mój temat - czy może być tak, ponieważ działałem lokalnie (bardzo w to wątpię)? Będę miał go online i pokażę ci wkrótce.
cr0z3r
13

Kodeks Wordpress ma odpowiedź poniżej.

Ustaw rozmiar obrazu, przycinając obraz i określając pozycję przycięcia:

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

Podczas ustawiania pozycji kadrowania pierwszą wartością w tablicy jest pozycja kadrowania na osi x, a druga pozycja kadrowania na osi y.

x_crop_position przyjmuje „lewy” „środek” lub „prawy”. y_crop_position akceptuje „góra”, „środek” lub „dół”. Domyślnie te wartości są domyślnie „wyśrodkowane”, gdy używany jest tryb przycinania.

A także kodeks odwołuje się do strony, która pokazuje, jak działają pozycje uprawy.

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

ewroman
źródło
To niesamowite, powinna być zaakceptowana odpowiedź, tak myślę!
Dalton,
0

Alternatywne rozwiązanie tutaj: http://pixert.com/blog/cropping-post-featured-thumbnails-from-top-instead-of-center-in-wordpress-with-native-cropping-tool/

Wystarczy dodać ten kod do functions.php, a następnie użyć wtyczki „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
źródło
Cześć Niente0, witaj w WPSE i dziękuję za odpowiedź. Czy mógłbyś edytować swój post, aby wyjaśnić, co robi Twój kod? Posty w witrynach StackExchange powinny wyjaśniać swoje rozwiązanie i zawierać tylko linki zewnętrzne w charakterze referencji, a nie całe rozwiązania. Dzięki jeszcze raz!
Tim Malone