¿Cómo cambiar el tipo de imagen para un tamaño específico?

8

Estoy optimizando un sitio con gran cantidad (decenas) de imágenes en la página en una cuadrícula. Para el soporte de retina, las imágenes también deben tener un tamaño 2x.

La fruta que colgaba bajo era asegurarse de que se cargaran los tamaños de las miniaturas (que todavía tienen un ancho considerable de 520 px debido a la retina) en lugar del tamaño original completo que tenían.

Sin embargo, casi todas las imágenes se guardan en PNG. Lo cual es un gran desperdicio en imágenes fotográficas. Tendría sentido que las miniaturas generadas fueran JPG ... Excepto que no parece haber una manera de hacerlo.

Al mirar a través del código central, el más cercano parece ser, WP_Image_Editor->get_output_format()pero no parece amigable que se ajuste fácilmente y apunte a tamaños específicos.

¿Hay otros puntos en el código donde podría intentar cambiar el tipo de imagen que se genera?

Rarst
fuente

Respuestas:

10

Puedes usar el wp_generate_attachment_metadatafiltro:

function wpse_183835_to_jpeg( $meta, $post_id ) {
    $sizes_to_convert = array(
        'thumbnail',
    );

    $path = dirname( get_attached_file( $post_id ) );

    foreach ( $sizes_to_convert as $size ) {
        if ( ! empty( $meta['sizes'][ $size ] ) ) {
            $data = $meta['sizes'][ $size ];
            if ( $data['mime-type'] === 'image/png' && is_file( $file = "$path/{$data['file']}" ) ) {
                if ( $image =@ imagecreatefrompng( $file ) ) {
                    // Change file extension
                    $file_jpg = preg_replace( '/\.[^\.]+$/', '', $data['file'] ) . '.jpg';

                    if ( @ imagejpeg( $image, "$path/$file_jpg", 90 ) ) { // Save new jpg version
                        // Update metadata with new filename
                        $meta['sizes'][ $size ]['file'] = $file_jpg;
                        // Delete png version
                        @ unlink( $file );
                    }

                    @ imagedestroy( $image );
                }
            }
        }
    }

    return $meta;
}

add_filter( 'wp_generate_attachment_metadata', 'wpse_183835_to_jpeg', 10, 2 );

https://codex.wordpress.org/Function_Reference/wp_generate_attachment_metadata

TheDeadMedic
fuente
1
¡Oro! Ahora que lo he visto, recordé esta técnica de jugar con las imágenes. vez que se han generado. :) Probado y trabajando, gracias.
Rarst