在产生最大比例尺寸的地方添加图像尺寸


8

我想添加一个图像尺寸,使生成的图像将是最大可能的尺寸,同时保持4:3的宽高比。

假设我添加了一个图像大小,如下所示:

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

默认情况下,如果全尺寸图像大于这些尺寸,WP将仅创建具有该尺寸的图像。

但是,假设我的全尺寸图片只有1000px宽。我仍然希望将图像裁剪为最大可能的4:3比例,在这种情况下为1000x750。

能做到吗?

Answers:


11

该方法

我认为最好的方法是在调整图像大小之前“实时”创建图像大小。

您可以使用'intermediate_image_sizes_advanced'滤镜挂钩。这使您可以编辑要生成的大小,但要知道当前图像的大小,该大小存储在$metadata过滤器作为第二个参数传递的数组中。

数学

首先,让我们编写一个类,以特定比率返回最大大小。

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 );
  }

}

类用法

该类的用法非常简单:

$ratio = new ImageRatio(4, 3)

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

行动中

此时,我们可以使用该类根据要上传的图像动态计算新的图像尺寸

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

使用新尺寸

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

注意

当然,这适用于代码到位上传的所有图像。对于较旧的图像,应在使用时即时生成缩略图,或使用网络上可用的插件之一批量生成缩略图。


效果很好,谢谢!我将做一个小小的修正:我认为没有必要在构造函数中设置默认比率,因为将来我可能会将此默认比率用于其他比率。在实例化时始终提供所需的比率是有意义的。
克里斯·蒙哥马利

构造函数中的args仅是默认值。您可以传递所需的任何比率,只有在不传递任何比率时才使用默认比率
gmazzap
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.