Imposta la compressione JPEG per dimensioni dell'immagine personalizzate specifiche


8

Uso varie dimensioni di immagine personalizzate (per add_image_size) e ho impostato la mia compressione JPEG al 30% con questo filtro:

function jpeg_quality_callback($arg) {
   return (int)30;
}
add_filter('jpeg_quality', 'jpeg_quality_callback');

Se non sbaglio, il codice sopra comprime tutte le dimensioni delle mie immagini personalizzate con il 30%. Ora, per due delle mie dimensioni di immagine personalizzate denominate splash1e splash2, voglio impostare la compressione sull'80%. Com'è possibile?

O in alternativa, escludi quelle dimensioni dell'immagine dal filtro di compressione del 30%.

Risposte:


9

Le 'jpeg_quality'funzioni di hook del filtro accettano due argomenti: $jpeg_qualitye $functionquale è la funzione all'interno dell'hook del filtro viene attivata e può essere image_resizeo wp_crop_image. Pertanto, non è possibile impostare in modo selettivo la qualità delle .jpegimmagini in base alle dimensioni dell'immagine da questa funzione di aggancio del filtro.

Tuttavia, è ancora possibile agganciarsi a un gancio di azione successivo nel processo di caricamento degli allegati e regolare la .jpegqualità dell'immagine delle immagini caricate in quel punto in base alle loro dimensioni specifiche in base alle proprie esigenze. Innanzitutto impostare il jpeg_qualitymassimo per preservare la qualità dell'immagine originale, quindi agganciare al gancio di added_post_metaazione (che viene attivato alla fine dell'inserimento dei metadati degli allegati) per regolare la qualità, come segue:

// set the quality to maximum
add_filter('jpeg_quality', create_function('$quality', 'return 100;'));

add_action('added_post_meta', 'ad_update_jpeg_quality', 10, 4);

function ad_update_jpeg_quality($meta_id, $attach_id, $meta_key, $attach_meta) {

    if ($meta_key == '_wp_attachment_metadata') {

        $post = get_post($attach_id);

        if ($post->post_mime_type == 'image/jpeg' && is_array($attach_meta['sizes'])) {

            $pathinfo = pathinfo($attach_meta['file']);
            $uploads = wp_upload_dir();
            $dir = $uploads['basedir'] . '/' . $pathinfo['dirname'];

            foreach ($attach_meta['sizes'] as $size => $value) {

                $image = $dir . '/' . $value['file'];
                $resource = imagecreatefromjpeg($image);

                if ($size == 'spalsh') {
                    // set the jpeg quality for 'spalsh' size
                    imagejpeg($resource, $image, 100);
                } elseif ($size == 'spalsh1') {
                    // set the jpeg quality for the 'splash1' size
                    imagejpeg($resource, $image, 30);
                } else {
                    // set the jpeg quality for the rest of sizes
                    imagejpeg($resource, $image, 10);
                }

                // or you can skip a paticular image size
                // and set the quality for the rest:
                // if ($size == 'splash') continue;

                imagedestroy($resource);
            }
        }
    }
}

Il codice sopra avrà effetto solo sulle immagini appena caricate. Se desideri aggiornare la qualità delle immagini caricate in precedenza, puoi utilizzare i register_activation_hookplug-in. Crea un nuovo file php nella wp-content/pluginsdirectory e chiamalo come preferisci ( update-jpeg-quality.phpad esempio) e aggiungi il seguente codice:

<?php
/*
Plugin Name: Update JPEG Quality
Plugin URI: http://wordpress.stackexchange.com/questions/74103/set-jpeg-compression-for-specific-custom-image-sizes
Description: This plugin will change the jpeg image quality according to its size.
Author: Ahmad M
Version: 1.0
Author URI: http://wordpress.stackexchange.com/users/12961/ahmad-m
*/

register_activation_hook(__FILE__, 'ad_modify_jpeg_quality');

function ad_modify_jpeg_quality() {

    $attachments = get_posts(array(
        'numberposts' => -1,
        'post_type' => 'attachment',
        'post_mime_type' => 'image/jpeg'
    ));

    if (empty($attachments)) return;

    $uploads = wp_upload_dir();

    foreach ($attachments as $attachment) {

        $attach_meta = wp_get_attachment_metadata($attachment->ID);
        if (!is_array($attach_meta['sizes'])) break;

        $pathinfo = pathinfo($attach_meta['file']);
        $dir = $uploads['basedir'] . '/' . $pathinfo['dirname'];

        foreach ($attach_meta['sizes'] as $size => $value) {

            $image = $dir . '/' . $value['file'];
            $resource = imagecreatefromjpeg($image);

            if ($size == 'spalsh') {
                // set the jpeg quality for 'spalsh' size
                imagejpeg($resource, $image, 100);
            } elseif ($size == 'spalsh1') {
                // set the jpeg quality for the 'splash1' size
                imagejpeg($resource, $image, 30);
            } else {
                // set the jpeg quality for the rest of sizes
                imagejpeg($resource, $image, 10);
            }

            imagedestroy($resource);
        }
    }
}
?>

Ora visita la tua pagina Plugin e premi activateil Update JPEG Qualityplugin. Ciò scorrerà in sequenza tutte le .jpegimmagini caricate in precedenza e ne regolerà la qualità in base ai valori e alle condizioni specificati nel plug-in. Quindi puoi disattivare ed eliminare in modo sicuro questo plugin. Si prega di testare sull'ambiente di test prima di applicare al sito di produzione .


Questa è una risposta molto interessante. Come aggiungo 'splash1' e 'splash2' all'istruzione IF ?: if ($ size == 'splash') ...
Amanda Duke,

1
@AmandaDuke: puoi estendere la ifdichiarazione di elseif. Vedi il mio aggiornamento
Ahmad M

2
@Ahmad c'è un bug nel tuo codice. Durante il caricamento di un'immagine, se è più piccolo rispetto alle dimensioni della più piccola dimensione immagine personalizzata, allora appare questo errore: Invalid argument supplied for foreach(). Quindi sostanzialmente, quando non viene creata alcuna immagine personalizzata, appare l'errore. Sai come risolvere questo problema?
Amanda Duke,

1
@AmandaDuke Grazie per averlo sottolineato. Questo errore si verifica perché $attach_meta['sizes']si prevede che sia un array, mentre in questo caso non lo è. Nella maggior parte dei casi dovrebbe e ciò può accadere solo se non abbiamo dimensioni dell'immagine personalizzate e non specifichiamo le dimensioni dell'immagine predefinite in Impostazioni -> Impostazioni media . Per essere sicuri e sicuri di avere un array possiamo aggiungere un controllo prima di passarlo al foreachciclo: if (is_array($attach_meta['sizes'])). Si prega di consultare il codice aggiornato.
Ahmad M

1
@AmandaDuke: entrambi i blocchi di codice sono stati aggiornati. Il primo blocco era prima: if ( $post->post_mime_type == 'image/jpeg' )e ora lo èif ( $post->post_mime_type == 'image/jpeg' && is_array($attach_meta['sizes']) )
Ahmad M
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.