Как изменить тип изображения для определенного размера?

8

Я оптимизирую сайт с большим (десятками) количеством изображений на странице в сетке. Для поддержки сетчатки изображения также должны быть в 2 раза больше.

Низко висящий фрукт должен был убедиться, что размеры миниатюр загружены (которые все еще имеют значительную ширину 520 пикселей из-за сетчатки) вместо того, чтобы иметь полный исходный размер.

Однако почти все изображения сохраняются в формате PNG. Который является огромной тратой на фотографические изображения. Было бы целесообразно, чтобы сгенерированные эскизы были в формате JPG ... За исключением того, что, похоже, не существует способа сделать это.

Из основного кода кажется, что WP_Image_Editor->get_output_format()он наиболее близок, но, кажется, не очень удобно его легко настраивать, ориентируясь на конкретные размеры.

Есть ли другие моменты в коде, где я мог бы попытаться изменить тип генерируемого изображения?

Rarst
источник

Ответы:

10

Вы можете использовать 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

TheDeadMedic
источник
1
Золото! Теперь, когда я посмотрел на нее, я на самом деле вспомнил эту технику игры с изображениями после того, как они были сгенерированы. :) Проверено и работает, спасибо.
Rarst