Tiếp cận
Tôi nghĩ cách tiếp cận tốt nhất là tạo kích thước hình ảnh "nhanh chóng", ngay trước khi hình ảnh được thay đổi kích thước.
Bạn có thể làm điều đó bằng cách sử dụng 'intermediate_image_sizes_advanced'
bộ lọc móc. Điều đó cho phép bạn chỉnh sửa kích thước sẽ được tạo, nhưng nhận thức được kích thước hình ảnh hiện tại, được lưu trữ trong mảng $metadata
được bộ lọc chuyển qua làm đối số thứ hai.
Toán
Trước hết, hãy viết một lớp trả về các kích thước lớn nhất cho một tỷ lệ cụ thể.
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 );
}
}
Sử dụng lớp học
Việc sử dụng lớp khá dễ dàng:
$ratio = new ImageRatio(4, 3)
$ratio->getLargestSize(1000, 500); // return: array(667, 500)
$ratio->getLargestSize(1000, 800); // return: array(1000, 750)
Trong hành động
Tại thời điểm này, chúng ta có thể sử dụng lớp để tính toán kích thước hình ảnh mới, dựa trên hình ảnh đang được tải lên
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 );
Sử dụng kích thước mới
$image = wp_get_attachment_image( $attachment_id, 'biggest-4-3' );
Ghi chú
Tất nhiên, điều này hoạt động cho tất cả các hình ảnh mà bạn tải lên sau khi mã được đặt. Đối với hình ảnh cũ hơn, bạn nên tạo lại hình thu nhỏ, khi đang sử dụng hoặc hàng loạt sử dụng một trong các plugin có sẵn trên web.