Come aggiungere più dimensioni di immagine della stessa dimensione con add_image_size


8

Sto usando un filtro in scala di grigi su tutte le immagini caricate nella mia installazione di WordPress. Tuttavia, desidero sia l'immagine in scala di grigi sia l'immagine colorata nel mio sito Web (colorata al passaggio del mouse). Il modo in cui ho provato a farlo è stato creare un sacco di add_image_size () in questo modo:

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 poi farei un filtro sulle immagini e prenderei solo gli ID * in scala di grigi e li salverei:

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

Funzionerebbe bene, ma apparentemente add_image_size () esamina gli argomenti di larghezza e altezza e quando una dimensione è già definita con quella combinazione, la dimensione non viene aggiunta. Posso capire che, poiché la funzione è quella di aggiungere nuove dimensioni, e se la dimensione è una copia, è meglio non aggiungerla di nuovo per risparmiare tempo di elaborazione. Ma ora voglio due immagini con le stesse dimensioni, ma una con un filtro applicato ad essa e l'altra l'originale.

Come posso raggiungere questo obiettivo?

Ho provato ad aggiungere un'altra dimensione che è solo un pixel più ampia, come:

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

E poi ridimensionare l'immagine in seguito dopo che il filtro è tornato a 100/200/400qualunque cosa. Ma non sembra giusto, e confonde anche le get_the_post_thumbnail()chiamate come si pensa ancora che la dimensione dell'immagine sia 101x$height. Inoltre, non è così semplice come ridimensionare l'immagine di un pixel in orizzontale e in verticale poiché i rapporti potrebbero causare l'altezza > 1pxpiù alta quando si ha una larghezza + 1px.


Coen, dovresti pubblicare la tua soluzione come risposta. Controlla le FAQ e vedrai che è ok per rispondere alle tue domande.
brasofilo,

1
@brasofilo sì, lo so, ma al momento non avevo abbastanza reputazione per rispondere alla mia domanda entro 24 ore dalla pubblicazione. Normalmente lo faccio, non ti preoccupare.
Coen,

Woops ... è tempo che io torni alle FAQ e legga quella parte della reputazione. Ottimo codice di esempio nelle tue domande e risposte e grazie per il gentile feedback :)
brasofilo,

Risposte:


9

Accidenti, continuo a risolvere i miei problemi tutto il tempo. Ecco come l'ho risolto alla fine. Ho scoperto che add_image_size non ignora le dimensioni identiche della dimensione dell'immagine, ma punta invece il nome del file verso lo stesso file nella directory dei caricamenti. Una volta che lo sapevo, potevo semplicemente salvare l'immagine in scala di grigi con un nome diverso, restituire quel nome al $ meta array nel mio hook e WP lo prende come informazioni da archiviare nel database. Tutte le funzioni get_thumbnail () funzionano ancora come dovrebbero e posso solo richiedere 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;
}

Questo è fantastico, ed è esattamente quello che volevo fare anch'io, ma con un effetto moltiplicatore in modalità fusione Photoshop. Avevo il codice per creare con successo un'immagine rossa moltiplicata da un'altra in PHP normale, ma non riuscivo a capire come farla applicare a tutte le dimensioni attuali dell'immagine.
Mike Kormendy,

Una cosa che ho notato è che questo non funziona abbastanza per i rigeneratori di immagini e le immagini non archiviate nel mese corrente per i post.
Mike Kormendy,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.