問題描述

我在我的 WordPress 安裝中的所有上傳的圖像上使用灰度過濾器。但是,我想要在我的網站上的灰色圖像和彩色圖像 (懸停在彩色上) 。我試圖這樣做的方式是創建一堆如此的 add_image_size():

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

然後我會對圖像進行過濾,只能使用* -grayscale ID 並保存它們:

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

它可以正常工作,但顯然, add_image_size() 查看 width 和 height 參數,當大小已經使用該組合定義時,不會添加大小。我可以理解,由於功能是添加新的大小,如果大小是重複的,通常最好不要再添加它來節省處理時間。但是現在我想要兩個尺寸相同的圖像,但是一個具有過濾器的圖像被應用到原來的圖像中。

我該如何實現?

我已經嘗試添加另一個尺寸,只有一個像素寬,如:

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

然後在過濾器返回 100/200/400 之後再調整圖像大小。但是它感覺不對,它也搞砸了 get_the_post_thumbnail()調用,因為它仍然認為圖像尺寸是 101x$height 。它也不像水平和垂直一個像素重新調整圖像大小,因為比例可能會導致當寬度為+ 1px 時,高度為> 1px 高。

最佳解決方案

哎,我一直在解決自己的問題。這是我最後解決的問題。我發現 add_image_size 不會忽略圖像尺寸的相同尺寸,而是將文件名指向上傳文件中相同的文件。一旦我知道了,我可以用不同的名字保存灰度圖像,將該名稱返回到我的鈎子中的 $ meta 數組,WP 將其作為存儲在數據庫中的信息。 All get_thumbnail() 功能仍然可以正常工作,我可以只要求格式編號。

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

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。