問題描述
我在我的 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。