Thêm kích thước hình ảnh trong đó kích thước tỷ lệ lớn nhất có thể được tạo ra


8

Tôi muốn thêm kích thước hình ảnh trong đó hình ảnh thu được sẽ là kích thước lớn nhất có thể trong khi vẫn giữ tỷ lệ khung hình 4: 3.

Giả sử tôi đã thêm kích thước hình ảnh như vậy:

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

Theo mặc định, WP sẽ chỉ tạo một hình ảnh với kích thước đó nếu hình ảnh kích thước đầy đủ lớn hơn các kích thước đó.

Nhưng giả sử hình ảnh kích thước đầy đủ của tôi chỉ rộng 1000px. Tôi vẫn muốn có một hình ảnh được cắt theo tỷ lệ 4: 3 lớn nhất có thể, trong trường hợp này sẽ là 1000x750.

Điều này có thể được thực hiện?

Câu trả lời:


11

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.


Điều này làm việc tuyệt vời, cảm ơn! Một điều chỉnh nhỏ tôi sẽ thực hiện: Tôi nghĩ rằng không cần thiết phải đặt tỷ lệ mặc định trong hàm tạo, vì tôi có thể sử dụng tỷ lệ này cho các tỷ lệ khác trong tương lai. Làm cho ý nghĩa để luôn luôn cung cấp tỷ lệ mong muốn trên khởi tạo.
Chris Montgomery

Các đối số trong constructor chỉ là mặc định. Bạn có thể vượt qua bất kỳ tỷ lệ nào bạn muốn, mặc định chỉ được sử dụng nếu bạn không vượt qua bất cứ điều gì
gmazzap
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.