Wie kann ich add_image_size () von oben beschneiden?

20

Ich habe eine Reihe von Beiträgen, alle mit vorgestellten Bildern, aber ich muss in der Lage sein, die rechte obere Ecke des Zuschnitts anzupassen. In diesem Fall müssen sie von oben rechts abgeschnitten werden, aber es wäre nützlich, auch zu wissen, wie man diesen Punkt selbst positioniert.

Derzeit nimmt die Funktion add_image_size () den Zuschnitt aus der Bildmitte. Nicht immer hübsch !!

Milder Flaum
quelle

Antworten:

13

Die Zwischenbilderzeugung ist extrem starr. image_resize()Hält es dicht am Code und hat keine Haken.

Die einzige Möglichkeit dafür ist, sich in ein wp_generate_attachment_metadataWP-generiertes Bild einzuklinken und es mit Ihrem eigenen zu überschreiben (was ein wenig von einer image_resize()Gabelung erfordert ).

Ich benötige dies für die Arbeit, damit ich später möglicherweise Code freigeben kann.

Ok, hier ist ein grobes, aber funktionierendes Beispiel. Beachten Sie, dass zum Einrichten des Ernteguts das Verständnis von erforderlich ist 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
quelle
1
klingt sehr nach dem Durcheinander mit dem Kern !!
Mild Fuzz
5
Nein, das Durcheinander mit dem Kern würde die image_resizeFunktion verändern. Rarst machte den Punkt, dass Sie sich in den Größenänderungsprozess einklinken müssten, aber die Bildgrößen selbst manuell erstellen.
TheDeadMedic
Darf ich fragen, ob das noch funktioniert? Ich habe den Hook gerade in meine functions.php-Datei implementiert und die Funktionen von add_image_size () eingerichtet, aber die beschnittenen Bilder werden immer noch von der Mitte aus beschnitten.
cr0z3r
@ cr0z3r Ich kenne keinen Grund, warum es nicht funktioniert. Beachten Sie jedoch, dass dies nur ein grobes Proof-of-Concept-Beispiel ist und kein aussagekräftiger, zuverlässiger Code.
Rarst
Hm, seltsamerweise funktioniert es bei meinem Thema nicht - könnte es sein, dass ich lokal lief (ich bezweifle es sehr)? Ich werde es online haben und es dir bald zeigen.
cr0z3r
13

Wordpress Codex hat die Antwort, es ist unten.

Stellen Sie die Bildgröße ein, indem Sie das Bild zuschneiden und eine Zuschneideposition definieren:

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

Beim Festlegen einer Ernteposition ist der erste Wert im Array die Ernteposition auf der x-Achse und der zweite Wert die Ernteposition auf der y-Achse.

x_crop_position akzeptiert 'left' 'center' oder 'right'. y_crop_position akzeptiert 'top', 'center' oder 'bottom'. Standardmäßig sind diese Werte bei Verwendung des Modus für hartes Zuschneiden auf "Mitte" eingestellt.

Außerdem verweist Codex auf eine Seite, die zeigt, wie sich die Zuschnittpositionen auswirken.

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

ewroman
quelle
Das ist genial, sollte die akzeptierte Antwort sein, finde ich!
Dalton
7

Ich habe eine Lösung für dieses Problem entwickelt, die kein Hacken des Kerns erfordert: http://bradt.ca/archives/image-crop-position-in-wordpress/

Ich habe auch einen Patch an Core gesendet : http://core.trac.wordpress.org/ticket/19393

Fügen Sie sich als Cc auf dem Ticket hinzu, um Ihre Unterstützung für das Hinzufügen zum Core anzuzeigen.

bradt
quelle
2
Die Lösung von @ Rarst ändert auch keine Kerndateien. ;)
fuxia
1
@toscho Ich denke, er hat nicht gemeint, dass die andere Antwort den Kerncode ändert.
Kaiser
0

Alternative Lösung hier: http://pixert.com/blog/cropping-post-featured-thumbnails-from-top-instead-of-center-in-wordpress-with-native-cropping-tool/

Füge einfach diesen Code zu functions.php hinzu und benutze dann das 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
quelle
Hallo Niente0, willkommen bei WPSE und vielen Dank für Ihre Antwort. Würde es Ihnen etwas ausmachen, Ihren Beitrag zu bearbeiten, um zu erklären, was Ihr Code bewirkt? Beiträge auf StackExchange-Sites sollten deren Lösung erläutern und nur Links außerhalb der Site als Verweise enthalten, nicht als vollständige Lösungen. Danke noch einmal!
Tim Malone