Answers:
我认为最好的方法是在调整图像大小之前“实时”创建图像大小。
您可以使用'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' );
当然,这适用于代码到位后上传的所有图像。对于较旧的图像,应在使用时即时生成缩略图,或使用网络上可用的插件之一批量生成缩略图。