Comment puis-je créer un recadrage add_image_size () par le haut?

19

J'ai une série de publications, toutes contenant des images, mais je dois pouvoir personnaliser le recadrage en haut à droite. Dans ce cas, j’ai besoin de les rogner en haut à droite, mais il serait utile de savoir comment positionner moi-même ce point.

À l’heure actuelle, la fonction add_image_size () tire son contenu du centre de l’image. Pas toujours jolie !!

    
posée Mild Fuzz 24.06.2011 - 11:11

5 réponses

13

La génération d'images intermédiaires est extrêmement rigide. image_resize() le garde proche du code et manque complètement de hooks.

En gros, la seule option possible consiste à se connecter à wp_generate_attachment_metadata et à écraser l'image générée par WP avec la vôtre (ce qui nécessitera un peu de image_resize() fork).

J'en ai besoin pour travailler afin de pouvoir partager du code ultérieurement.

Ok, voici un exemple approximatif, mais pratique. Notez que configurer cette culture de cette manière nécessite de comprendre 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;
}
    
réponse donnée Rarst 24.06.2011 - 11:28
9

Le codex Wordpress a la réponse ci-dessous.

  

Définissez la taille de l'image en la coupant et en définissant une position de recadrage:

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

Lorsque vous définissez une position de recadrage, la première valeur du tableau est le x   la position de recadrage de l’axe, la seconde est la position de recadrage de l’axe des y.

     

x_crop_position accepte "gauche", "centre" ou "droite". y_crop_position   accepte 'haut', 'centre' ou 'bas'. Par défaut, ces valeurs default   pour "centrer" lorsque vous utilisez le mode de rognage difficile.

Et le codex fait également référence à une page qui montre comment les positions de recadrage agissent.

  

enlace

    
réponse donnée ewroman 04.02.2015 - 16:29
7

J'ai développé une solution à ce problème qui ne nécessite pas de piratage du coeur: enlace

J'ai également soumis un correctif à core: enlace

Ajoutez-vous en tant que Cc sur le ticket pour montrer votre soutien à son ajout au cœur.

    
réponse donnée bradt 19.02.2012 - 15:37
3

Vous pouvez utiliser le plug-in Position de recadrage de la vignette pour sélectionner la position de recadrage de vos vignettes. / p>     

réponse donnée PoseLab 10.01.2013 - 14:13
0

Solution alternative ici: enlace

Ajoutez simplement ce code au fichier functions.php, puis utilisez le plug-in "Regenerate Thumbnails" ( enlace ):

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 );
    
réponse donnée Niente0 27.04.2016 - 10:36

Lire d'autres questions sur les étiquettes