Comment ajouter plusieurs tailles d'image de la même taille avec add_image_size

8

J'utilise un filtre en niveaux de gris sur toutes les images téléchargées dans mon installation WordPress. Cependant, je veux à la fois l'image à l'échelle grise et l'image colorée dans mon site Web (colorée en survol). La façon dont j'ai essayé de le faire était de créer un tas de add_image_size () comme ceci:

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

Et puis je ferais un filtre sur les images et ne prendrais que les ID * -grayscale et les enregistrer:

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

Cela fonctionnerait bien, mais apparemment, add_image_size () examine les arguments width et height et lorsqu'une taille est déjà définie avec cette combinaison, la taille n'est pas ajoutée. Je peux comprendre que, puisque la fonction consiste à ajouter de nouvelles tailles, et si la taille est un doublon, il est normalement préférable de ne pas l'ajouter à nouveau pour gagner du temps de traitement. Mais maintenant, je veux deux images de la même taille, mais une avec un filtre appliqué et l'autre l'original.

Comment puis-je atteindre cet objectif?

J'ai essayé d'ajouter une autre taille qui est juste un pixel plus large, comme:

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

Et puis redimensionner l'image plus tard après le filtre à nouveau 100/200/400. Mais cela ne se sent pas bien, et cela gâche aussi les get_the_post_thumbnail()appels comme on pense toujours que la dimension d'image est 101x$height. Ce n'est pas aussi simple que de redimensionner l'image d'un pixel horizontalement et verticalement car les rapports pourraient faire en sorte que la hauteur soit > 1pxplus grande lorsque vous avez une largeur + 1 px.

Coen
la source
Coen, vous devez publier votre solution comme réponse. Consultez la FAQ et vous verrez que vous pouvez répondre à vos propres questions.
brasofilo
1
@brasofilo oui je sais mais à l'époque je n'avais pas assez de réputation pour répondre à ma propre question dans les 24h suivant sa publication. Normalement, je fais ça, ne vous inquiétez pas.
Coen
Oups ... il est temps pour moi de revenir à la FAQ et de lire cette partie de la réputation. Grand exemple de code dans votre Q&R et merci pour les commentaires aimables :)
brasofilo

Réponses:

9

Gee, je continue de résoudre mes propres problèmes tout le temps. Voici comment je l'ai résolu à la fin. J'ai découvert que add_image_size n'ignore pas les dimensions identiques de la taille de l'image, mais pointe le nom du fichier vers le même fichier dans le répertoire de téléchargement. Une fois que je savais cela, je pouvais simplement enregistrer l'image en niveaux de gris sous un nom différent, retourner ce nom au tableau $ meta dans mon crochet, et WP prend cela comme information à stocker dans la base de données. Toutes les fonctions get_thumbnail () fonctionnent toujours comme elles le devraient et je peux simplement demander l'ID -grayscale.

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
la source
C'est génial, et c'est exactement ce que je voulais faire, mais avec un effet multiplicateur en mode mélange Photoshop à la place. J'avais le code pour réussir à créer une image rouge multipliée à partir d'une autre en PHP normal, mais je n'ai pas pu trouver comment l'appliquer à toutes les tailles d'image actuelles.
Mike Kormendy
Une chose que j'ai remarquée, c'est que cela ne fonctionne pas tout à fait pour les régénérateurs d'images et les images non stockées dans le mois en cours pour les publications.
Mike Kormendy