web-dev-qa-db-fra.com

Comment changer le type d'image pour une taille spécifique?

J'optimise un site avec une quantité importante (des dizaines) d'images sur la page dans une grille. Pour la prise en charge de la rétine, les images doivent également être de taille 2x.

La solution la plus simple était de s’assurer que les tailles des vignettes sont bien chargées (elles ont toujours une largeur considérable de 520px en raison de la rétine) au lieu de la taille originale.

Cependant, presque toutes les images sont enregistrées au format PNG. Ce qui est un énorme gaspillage sur l'imagerie photographique. Il serait logique que les miniatures générées soient au format JPG ... Sauf qu’il ne semble pas y avoir de moyen de le faire.

En regardant à travers le code principal, le plus proche semble être WP_Image_Editor->get_output_format() mais il ne semble pas facile d’être ajusté et de cibler des tailles spécifiques.

Y a-t-il d'autres points dans le code où je pourrais essayer de changer le type d'image générée?

8
Rarst

Vous pouvez utiliser le filtre wp_generate_attachment_metadata:

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

10
TheDeadMedic