Tambahkan ukuran gambar di mana ukuran proporsional sebesar mungkin dihasilkan

8

Saya ingin menambahkan ukuran gambar di mana gambar yang dihasilkan akan menjadi ukuran terbesar yang mungkin sambil mempertahankan rasio aspek 4: 3.

Misalkan saya telah menambahkan ukuran gambar seperti:

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

Secara default, WP hanya akan membuat gambar dengan ukuran itu jika gambar ukuran penuh lebih besar dari dimensi itu.

Tapi misalkan gambar ukuran penuh saya hanya selebar 1000px. Saya masih ingin memangkas gambar dengan rasio 4: 3, yang dalam hal ini adalah 1000x750.

Bisakah ini dilakukan?

Chris Montgomery
sumber

Jawaban:

11

Pendekatan

Saya pikir pendekatan terbaik adalah membuat ukuran gambar "on the fly", tepat sebelum gambar diubah ukurannya.

Anda dapat melakukannya menggunakan 'intermediate_image_sizes_advanced'kait filter. Itu memungkinkan Anda untuk mengedit ukuran yang akan dihasilkan, tetapi menyadari ukuran gambar saat ini, yang disimpan dalam array yang $metadatadilewatkan oleh filter sebagai argumen kedua.

Matematika

Pertama-tama mari kita menulis kelas yang mengembalikan ukuran terbesar untuk rasio tertentu.

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

}

Penggunaan kelas

Penggunaan kelas cukup mudah:

$ratio = new ImageRatio(4, 3)

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

Beraksi

Pada titik ini, kita dapat menggunakan kelas untuk menghitung dengan cepat ukuran gambar baru, berdasarkan gambar yang sedang diunggah

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

Menggunakan Ukuran Baru

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

Catatan

Tentu saja, ini berfungsi untuk semua gambar yang Anda unggah setelah kode terpasang. Untuk gambar yang lebih tua, Anda harus membuat ulang thumbnail, dengan cepat saat digunakan, atau secara massal menggunakan salah satu plugin yang tersedia di web.

gmazzap
sumber
Ini bekerja dengan baik, terima kasih! Satu koreksi kecil yang akan saya buat: Saya pikir tidak perlu menetapkan rasio default di konstruktor, karena saya mungkin menggunakan ini untuk rasio lain di masa depan. Masuk akal untuk selalu menyediakan rasio yang diinginkan pada Instansiasi.
Chris Montgomery
Args dalam konstruktor hanyalah default. Anda dapat melewati rasio apa pun yang Anda inginkan, standar hanya digunakan jika Anda tidak lulus apa pun
gmazzap