Как добавить несколько размеров изображения одинакового размера с 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

И тогда я бы сделал фильтр на изображениях и взял бы только идентификаторы *-оттенков серого и сохранил их:

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 () просматривает аргументы ширины и высоты, и когда размер уже определен с этой комбинацией, размер не добавляется. Я понимаю, что, поскольку функция заключается в добавлении новых размеров, а если размер является дубликатом, обычно лучше не добавлять его снова, чтобы сэкономить время обработки. Но теперь я хочу два изображения одинакового размера, но одно с фильтром, а другое с оригиналом.

Как мне этого добиться?

Я попытался добавить другой размер, который всего на один пиксель шире, например:

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 пиксель.

Coen
источник
Коэн, ты должен опубликовать свое решение как Ответ. Проверьте FAQ, и вы увидите, что можно ответить на ваши собственные вопросы.
brasofilo
1
@brasofilo да, я знаю, но в то время у меня не было достаточно репутации, чтобы ответить на свой вопрос в течение 24 часов после публикации. Обычно я делаю это, не волнуйтесь.
Коэн
Woops ... время для меня, чтобы вернуться к FAQ и прочитать эту часть репутации. Отличный пример кода в ваших
вопросах и ответах

Ответы:

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;
}
Coen
источник
Это здорово, и это именно то, что я хотел сделать, но с эффектом умножения в режиме наложения фотошопа. У меня был код для успешного создания многократного красного изображения из другого в обычном PHP, но я не мог понять, как заставить его применять ко всем текущим размерам изображений.
Майк Корменди
Одна вещь, которую я заметил, состояла в том, что это не совсем работает для регенераторов изображений и изображений, не сохраненных в текущем месяце для сообщений.
Майк Корменди