Cara menambahkan beberapa ukuran gambar dengan ukuran yang sama dengan add_image_size

8

Saya menggunakan filter skala abu-abu pada semua gambar yang diunggah di instalasi WordPress saya. Namun saya ingin baik gambar skala abu-abu dan gambar berwarna di situs web saya (diwarnai pada hover). Cara saya mencoba melakukan ini adalah dengan membuat sekelompok add_image_size () seperti:

add_image_size( 'gho-small', 100, 0, true ); // Used for small images
add_image_size( 'gho-small-grayscale', 100, 0, true ); // Used for small grayscaled images
add_image_size( 'gho-medium', 200, 0, true ); // Used for medium images
add_image_size( 'gho-medium-grayscale', 200, 0, true ); // Used for medium grayscaled images
add_image_size( 'gho-large', 400, 0, true ); // Used for large images
add_image_size( 'gho-large-grayscale', 400, 0, true ); // Used for large grayscaled images

Dan kemudian saya akan melakukan filter pada gambar dan hanya mengambil ID * -labu-abu dan menyimpannya:

add_filter('wp_generate_attachment_metadata','gholumns_grayscale_filter');
function gholumns_grayscale_filter($meta)
{
    $dir = wp_upload_dir();
    $file = trailingslashit($dir['path']).$meta['sizes']['gho-large-grayscale']['file'];
    do_grayscale_filter($file);
    return $meta;
}

Ini akan berfungsi dengan baik, tetapi tampaknya add_image_size () terlihat pada argumen lebar dan tinggi dan ketika ukuran sudah ditentukan dengan kombinasi itu, ukurannya tidak ditambahkan. Saya dapat mengerti bahwa, karena fungsinya adalah untuk menambahkan ukuran baru, dan jika ukurannya adalah duplikat, biasanya lebih baik tidak menambahkannya lagi untuk menghemat waktu pemrosesan. Tapi sekarang saya ingin dua gambar dengan ukuran yang sama, tetapi satu dengan filter diterapkan padanya dan yang lain asli.

Bagaimana saya bisa mencapai ini?

Saya telah mencoba menambahkan ukuran lain yang hanya satu piksel lebih lebar, seperti:

add_image_size( 'gho-small-grayscale', 101, 0, true ); // Used for small grayscaled images

Dan kemudian mengubah ukuran gambar nanti setelah filter kembali ke 100/200/400apa pun. Tapi itu tidak terasa benar, dan itu juga mengacaukan get_the_post_thumbnail()panggilan karena orang masih berpikir dimensi gambar 101x$height. Ini juga tidak sesederhana mengubah ukuran gambar kembali satu piksel secara horizontal dan vertikal karena rasio dapat menyebabkan tingginya > 1pxlebih tinggi ketika Anda memiliki lebar + 1px.

Coen
sumber
Coen, Anda harus memposting solusi Anda sebagai Jawaban. Periksa FAQ dan Anda akan melihat bahwa tidak apa-apa untuk menjawab pertanyaan Anda sendiri.
brasofilo
1
@brasofilo ya saya tahu tetapi pada saat itu saya tidak memiliki reputasi yang cukup untuk menjawab pertanyaan saya sendiri dalam 24 jam setelah mempostingnya. Biasanya saya melakukan itu, jangan khawatir.
Coen
Wad ... saatnya bagi saya untuk kembali ke FAQ dan membaca bagian reputasi itu. Kode contoh yang bagus di T&J Anda dan terima kasih atas umpan balik yang baik :)
brasofilo

Jawaban:

9

Astaga, saya terus memecahkan masalah saya sendiri sepanjang waktu. Inilah cara saya menyelesaikannya pada akhirnya. Saya menemukan bahwa add_image_size tidak mengabaikan dimensi identik ukuran gambar, tetapi mengarahkan nama file ke file yang sama di direktori unggahan. Setelah saya tahu itu, saya bisa menyimpan gambar skala abu-abu dengan nama yang berbeda, mengembalikan nama itu ke $ meta array di hook saya, dan WP menganggap itu sebagai informasi untuk disimpan dalam database. Semua fungsi get_thumbnail () masih berfungsi sebagaimana mestinya dan saya hanya bisa meminta ID skala abu-abu.

add_filter('wp_generate_attachment_metadata','gholumns_grayscale_filter');
function gholumns_grayscale_filter($meta)
{
$file = $meta['sizes']['gho-large-grayscale']['file'];
$meta['sizes']['gho-large-grayscale']['file'] = do_grayscale_filter($file);
//do_resize($file, -1, -1); # No longer necessary!
$file = $meta['sizes']['gho-medium-grayscale']['file'];
$meta['sizes']['gho-medium-grayscale']['file'] = do_grayscale_filter($file);
//do_resize($file, -1, -1); # No longer necessary!
$file = $meta['sizes']['gho-small-grayscale']['file'];
$meta['sizes']['gho-small-grayscale']['file'] = do_grayscale_filter($file);
//do_resize($file, -1, -1); # No longer necessary!
return $meta;
}


function do_grayscale_filter($file)
{
$dir = wp_upload_dir();
$image = wp_load_image(trailingslashit($dir['path']).$file);
imagefilter($image, IMG_FILTER_GRAYSCALE);
return save_modified_image($image, $file, '-grayscale');
}

function save_modified_image($image, $filename, $suffix)
{
$dir = wp_upload_dir();
$dest = trailingslashit($dir['path']).$filename;

list($orig_w, $orig_h, $orig_type) = @getimagesize($dest);

$filename = str_ireplace(array('.jpg', '.jpeg', '.gif', '.png'), array($suffix.'.jpg', $suffix.'.jpeg', $suffix.'.gif', $suffix.'.png'), $filename);
$dest = trailingslashit($dir['path']).$filename;

switch ($orig_type)
{
    case IMAGETYPE_GIF:
        imagegif( $image, $dest );
        break;
    case IMAGETYPE_PNG:
        imagepng( $image, $dest );
        break;
    case IMAGETYPE_JPEG:
        imagejpeg( $image, $dest );
        break;
}

return $filename;
}
Coen
sumber
Ini hebat, dan persis apa yang ingin saya lakukan juga tetapi dengan efek multiply mode photoshop campuran gantinya. Saya memiliki kode untuk berhasil membuat gambar merah berlipat ganda dari yang lain di PHP biasa, tapi saya tidak tahu bagaimana cara membuatnya berlaku untuk semua ukuran gambar saat ini.
Mike Kormendy
Satu hal yang saya perhatikan adalah bahwa ini tidak berfungsi untuk regenerator gambar dan gambar yang tidak disimpan pada bulan berjalan untuk posting.
Mike Kormendy