问题描述
我在我的 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。