如何使用add_image_size添加相同大小的多个图像大小


8

我在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

然后,我将对图像进行过滤,仅使用*-灰度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时,比率可能会导致高度更高。


科恩,您应该发布解决方案作为答案。检查常见问题,您将可以回答自己的问题。
brasofilo 2012年

1
@brasofilo是的,我知道,但是当时我的声誉不足,无法在发布问题后24小时内回答我自己的问题。通常我会这样做,不用担心。
科恩2012年

糟糕,我该回到常见问题解答并阅读信誉部分。您的问答中的示例代码非常
出色

Answers:


9

哎呀,我一直都在解决自己的问题。这是我最终解决问题的方法。我发现add_image_size不会忽略图像大小的相同尺寸,而是将文件名指向上载目录中的同一文件。知道了这一点之后,我就可以将灰度图像保存为其他名称,将该名称返回到我的钩子中的$ meta数组中,然后WP将其作为信息存储在数据库中。所有的get_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;
}

这很棒,这正是我想做的,但是要用photoshop混合模式乘法效果。我拥有在常规的PHP中成功地从另一个图像成功制作一个红色图像的代码,但是我不知道如何将其应用于所有当前图像尺寸。
Mike Kormendy 2014年

我注意到的一件事是,这对于图像再生器和当月未存储的图像不完全有效。
Mike Kormendy 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.