Cómo agregar múltiples tamaños de imagen del mismo tamaño con add_image_size

8

Estoy usando un filtro de escala de grises en todas las imágenes cargadas en mi instalación de WordPress. Sin embargo, quiero tanto la imagen en escala de grises como la imagen en color en mi sitio web (coloreada al pasar el mouse). La forma en que intenté hacer esto fue crear un montón de add_image_size () así:

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

Y luego haría un filtro en las imágenes y solo tomaría las ID de escala de grises * y las guardaría:

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

Funcionaría bien, pero aparentemente add_image_size () analiza los argumentos de ancho y alto y cuando un tamaño ya está definido con esa combinación, el tamaño no se agrega. Puedo entender eso, ya que la función es agregar nuevos tamaños, y si el tamaño es un duplicado, normalmente es mejor no agregarlo nuevamente para ahorrar tiempo de procesamiento. Pero ahora quiero dos imágenes con el mismo tamaño, pero una con un filtro aplicado y la otra con el original.

¿Cómo puedo conseguir esto?

Intenté agregar otro tamaño que es solo un píxel más ancho, como:

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

Y luego cambiar el tamaño de la imagen más tarde después de que el filtro vuelva a 100/200/400lo que sea. Pero no se siente bien, y también desordena las get_the_post_thumbnail()llamadas, ya que todavía cree que la dimensión de la imagen es 101x$height. Tampoco es tan simple como cambiar el tamaño de la imagen en un píxel horizontal y verticalmente, ya que las proporciones podrían hacer que la altura sea > 1pxmás alta cuando tiene un ancho + 1px.

Coen
fuente
Coen, debe publicar su solución como respuesta. Consulte las preguntas frecuentes y verá que está bien responder sus propias preguntas.
brasofilo
1
@brasofilo sí, lo sé, pero en ese momento no tenía suficiente reputación para responder mi propia pregunta dentro de las 24 horas de haberlo publicado. Normalmente hago eso, no te preocupes.
Coen
Woops ... es hora de que vuelva a las preguntas frecuentes y lea esa parte de reputación. Gran código de muestra en sus preguntas y respuestas y gracias por los amables comentarios :)
brasofilo

Respuestas:

9

Dios, sigo resolviendo mis propios problemas todo el tiempo. Así es como lo resolví al final. Descubrí que add_image_size no ignora las dimensiones idénticas del tamaño de la imagen, sino que apunta el nombre del archivo hacia el mismo archivo en el directorio de carga. Una vez que sabía eso, podía guardar la imagen en escala de grises con un nombre diferente, devolver ese nombre a la matriz $ meta en mi gancho, y WP lo toma como información para almacenar en la base de datos. Todas las funciones get_thumbnail () siguen funcionando como deberían y puedo solicitar la ID de escala de grises.

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
fuente
Esto es genial, y es exactamente lo que quería hacer también, pero con un efecto multiplicador de modo de mezcla de Photoshop. Tenía el código para hacer con éxito una imagen roja multiplicada de otra en PHP normal, pero no pude encontrar la forma de aplicarlo a todos los tamaños de imagen actuales.
Mike Kormendy
Una cosa que noté fue que esto no funciona para los regeneradores de imágenes y las imágenes no almacenadas en el mes actual para publicaciones.
Mike Kormendy