我在WordPress安装中对所有上传的图像使用灰度过滤器。然而,我希望在我的网站中同时显示灰度图像和彩色图像(悬停时着色)。我尝试这样做的方式是创建一组add\\u image\\u size()\'s,如下所示:
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
然后我会对图像进行过滤,只提取*-灰度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\\u image\\u 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
宽度大于1倍时更高。
最合适的回答,由SO网友:Coen 整理而成
哎呀,我一直在解决我自己的问题。下面是我最后是如何解决的。我发现add\\u image\\u size并没有忽略图像大小的相同维度,而是将文件名指向uploads dir中的同一个文件。一旦我知道了这一点,我就可以用另一个名称保存灰度图像,将该名称返回到挂钩中的$元数组,WP将其作为信息存储在数据库中。所有get\\u thumbnail()函数仍在正常工作,我可以请求-grayscale ID。
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;
}