web-dev-qa-db-fra.com

Add it picture size

J'aimerais ajouter une taille d'image où l'image résultante aura la plus grande taille possible tout en conservant un rapport de format de 4: 3.

Supposons que j'ai ajouté une taille d'image comme ceci:

add_image_size( 'cover-image', 2048, 1536, true );

Par défaut, WP ne créera une image de cette taille que si celle-ci est plus grande que ses dimensions.

Mais supposons que mon image en taille réelle ne mesure que 1000 pixels de large. J'aimerais quand même avoir une image recadrée au plus grand ratio possible de 4: 3, ce qui serait dans ce cas 1000x750.

Cela peut-il être fait?

7
Chris Montgomery

L'approche

Je pense que la meilleure approche consiste à créer une taille d'image "à la volée", juste avant que les images ne soient redimensionnées.

Vous pouvez le faire en utilisant 'intermediate_image_sizes_advanced' filter hook. Cela vous permet d’éditer la taille à générer, mais en prenant en compte la taille actuelle de l’image, elle est stockée dans le tableau $metadata passé par le filtre en tant que second argument.

Les maths

Commençons par écrire une classe qui renvoie les plus grandes tailles pour un rapport spécifique.

class ImageRatio {

  private $ratio;

  function __construct($ratioW = 4, $ratioH = 3) {
    $this->ratio = array($ratioW, $ratioH);
  }

  function getLargestSize($imgW, $imgH) {
    $inverse = false;
    // let's try to keep width and calculate new height  
    $newSize = round(($this->ratio[1] * $imgW) / $this->ratio[0]);
    if ($newSize > $imgH) {
       $inverse = true;
       // if the calculated height is bigger than actual size
       // let's keep current height and calculate new width
       $newSize = round(($this->ratio[0] * $imgH) / $this->ratio[1]);
    }

    return $inverse ? array( $newSize, $imgH ) : array( $imgW, $newSize );
  }

}

Utilisation de la classe

L'utilisation de la classe est assez facile:

$ratio = new ImageRatio(4, 3)

$ratio->getLargestSize(1000, 500); // return: array(667, 500)
$ratio->getLargestSize(1000, 800); // return: array(1000, 750)

En action

À ce stade, nous pouvons utiliser la classe pour calculer à la volée une nouvelle taille d’image, en fonction du téléchargement de l’image.

add_filter( 'intermediate_image_sizes_advanced', function( $sizes, $metadata ) {

   if (! empty( $metadata['width'] ) && ! empty( $metadata['height'] ) ) {
      // calculate the max width and height for the ratio
      $ratio = new ImageRatio( 4, 3 );
      list($width, $height) = $ratio->getLargestSize( 
         $metadata['width'],
         $metadata['height']
      );
      // let's add our custom size
      $sizes['biggest-4-3'] = array(
        'width'  => $width,
        'height' => $height,
        'crop'   => true
      );
   }

   return $sizes;

}, 10, 2 );

Utiliser la nouvelle taille

$image = wp_get_attachment_image( $attachment_id, 'biggest-4-3' );

Remarque

Bien sûr, cela fonctionne pour toutes les images que vous téléchargez après le code est en place. Pour les images plus anciennes, vous devez générer à nouveau les vignettes, à la volée lorsqu'elles sont utilisées ou en bloc à l'aide de l'un des plug-ins disponibles sur le Web.

10
gmazzap