Wie ändere ich den Bildtyp für eine bestimmte Größe?

8

Ich optimiere eine Site mit einer großen (Dutzenden) Anzahl von Bildern auf einer Seite in einem Raster. Zur Unterstützung der Netzhaut müssen die Bilder auch 2x groß sein.

Die niedrig hängende Frucht sollte sicherstellen, dass die Miniaturbildgrößen geladen sind (die aufgrund der Netzhaut immer noch beachtlich 520 Pixel breit sind), anstatt die volle Originalgröße zu haben.

Fast alle Bilder werden jedoch in PNG gespeichert. Das ist eine enorme Verschwendung von fotografischen Bildern. Es wäre sinnvoll, wenn generierte Miniaturansichten JPG wären ... Außer, dass es keinen Weg zu geben scheint, dies zu tun.

Wenn man sich den Kerncode ansieht, scheint der nächste zu sein, WP_Image_Editor->get_output_format()aber es scheint nicht freundlich zu sein, einfach angepasst zu werden und auf bestimmte Größen abzuzielen.

Gibt es andere Punkte im Code, an denen ich versuchen könnte, den Typ des generierten Bildes zu ändern?

Selten
quelle

Antworten:

10

Sie können den wp_generate_attachment_metadataFilter verwenden:

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
quelle
1
Gold! Jetzt, wo ich es mir angesehen habe, hatte ich mich tatsächlich an diese Technik erinnert, mit Bildern zu spielen, nachdem sie erzeugt wurden. :) Getestet und funktioniert, danke.
Rarst