Como adicionar vários tamanhos de imagem do mesmo tamanho com add_image_size

8

Estou usando um filtro em escala de cinza em todas as imagens carregadas na minha instalação do WordPress. No entanto, quero a imagem em escala de cinza e a imagem colorida no meu site (coloridas ao passar o mouse). A maneira que eu tentei fazer isso foi criar um monte de add_image_size (), assim:

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

E então eu fazia um filtro nas imagens e pegava apenas os IDs em escala de cinza * e os salvava:

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;
}

Funcionaria bem, mas aparentemente add_image_size () analisa os argumentos de largura e altura e, quando um tamanho já está definido com essa combinação, o tamanho não é adicionado. Entendo que, como a função é adicionar novos tamanhos, e se o tamanho for uma duplicata, normalmente é melhor não adicioná-lo novamente para economizar tempo de processamento. Mas agora eu quero duas imagens do mesmo tamanho, mas uma com um filtro aplicado e a outra o original.

Como posso conseguir isso?

Eu tentei adicionar outro tamanho, que é apenas um pixel mais largo, como:

add_image_size( 'gho-small-grayscale', 101, 0, true ); // Used for small grayscaled images

E, em seguida, redimensionando a imagem mais tarde, após o filtro voltar para 100/200/400o que for. Mas não parece certo, e também atrapalha as get_the_post_thumbnail()chamadas, pois ainda se pensa que a dimensão da imagem é 101x$height. Também não é tão simples como redimensionar a imagem de volta em um pixel horizontal e verticalmente, pois as proporções podem causar que a altura seja > 1pxmais alta quando você tem uma largura + 1px.

Coen
fonte
Coen, você deve postar sua solução como resposta. Consulte as Perguntas frequentes e você verá que não há problema em responder suas próprias perguntas.
Brasofilo 28/05
11
@brasofilo sim, eu sei, mas na época eu não tinha reputação suficiente para responder minha própria pergunta dentro de 24 horas após publicá-la. Normalmente faço isso, não se preocupe.
Coen
Woops ... é hora de eu voltar ao FAQ e ler essa parte da reputação. Grande código de exemplo em suas perguntas e respostas e obrigado pelo feedback tipo :)
brasofilo

Respostas:

9

Nossa, eu continuo resolvendo meus próprios problemas o tempo todo. Aqui está como eu resolvi isso no final. Descobri que add_image_size não ignora as dimensões idênticas do tamanho da imagem, mas aponta o nome do arquivo para o mesmo arquivo no diretório de uploads. Depois que soubesse disso, eu poderia salvar a imagem em escala de cinza com um nome diferente, retornar esse nome para a matriz $ meta no meu gancho e o WP toma isso como informação para armazenar no banco de dados. Todas as funções get_thumbnail () ainda estão funcionando como deveriam e posso apenas solicitar o ID da escala de cinza.

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
fonte
Isso é ótimo, e exatamente o que eu queria fazer também, mas com um efeito de multiplicação no modo de mistura do photoshop. Eu tinha o código para criar com êxito uma imagem multiplicada em vermelho a partir de outra em PHP comum, mas não consegui descobrir como aplicá-la a todos os tamanhos de imagem atuais.
Mike Kormendy
Uma coisa que notei foi que isso não funciona muito bem para regeneradores de imagens e imagens não armazenadas no mês atual para postagens.
precisa