it-swarm.com.de

Wie kann ich add_image_size () von oben beschneiden?

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 !!

20
Mild Fuzz

Die Zwischenbilderzeugung ist extrem starr. image_resize() hält es in der Nähe von Code und es fehlen vollständig Hooks.

Die einzige Möglichkeit dafür ist, sich in wp_generate_attachment_metadata einzuklinken und das von WP generierte Bild mit Ihrem eigenen zu überschreiben (was etwas von einer image_resize()-Verzweigung 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 das Einrichten des Ernteguts auf diese Weise das Verständnis von imagecopyresampled() erfordert.

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;
}
13
Rarst

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

10
ewroman

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.

7
bradt

Sie können das Plugin Thumbnail Crop Position verwenden, um die Crop Position Ihrer Thumbnails auszuwählen.

3
PoseLab

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 );
0
Niente0