web-dev-qa-db-fra.com

Conserver les informations EXIF ​​de l'image après avoir compressé l'image d'origine?

Après des tests, je me suis rendu compte que Word Press après le téléchargement des images créerait des images de taille moyenne et miniatures de l’image originale sans info EXIF ​​/ IPTC

J'ai compris que c'est parce que la bibliothèque d'images Gd est utilisée sur mon hôte, et c'est ainsi que la bibliothèque Gd fonctionne par défaut, supprime toutes les informations sur l'image.

Après des recherches, j'ai découvert que, si ImageMagick et l'extension Imagick PHP sont utilisés à la place de la bibliothèque Gd, les informations EXIF ​​seront conservées (avec les paramètres par défaut d'ImageMagick) dans les fichiers d'image redimensionnés générés.


MISE À JOUR 1

ImageMagick et l'extension Imagick PHP sont installés sur mon hôte maintenant. Désormais, toutes les images générées conservent les informations EXIF ​​/ IPTC (images originales, moyennes et miniatures, toutes contenant des données EXIF ​​/ IPTC).

J'autorise les visiteurs à télécharger des images haute résolution sur le site. Dans la plupart des cas, les visiteurs n'optimisent/compressent pas les images avant le téléchargement et la taille du fichier d'image est parfois très grande.

Par exemple, une image de 12 mégapixels peut représenter 10 Mo. Toutefois, après 85% de compression jpeg, la taille du fichier peut être 2 à 3 fois plus petite, ce qui entraîne une perte de qualité quasi nulle.

Je mets cette fonction dans functions.php (mon dossier de thème) pour compresser l’image originale pendant le téléchargement, économiser de l’espace disque et accélérer le chargement de l’image haute résolution sur la page.

// Image compression on upload, compress original image
function wt_handle_upload_callback( $data ) {
    $image_quality = 85; // 85% compression
    $file_path = $data['file'];
    $image = false;

    switch ( $data['type'] ) {
        case 'image/jpeg': {
            $image = imagecreatefromjpeg( $file_path );
            imagejpeg( $image, $file_path, $image_quality );
            break;          
        }

        case 'image/png': {
            $image = imagecreatefrompng( $file_path );
            imagepng( $image, $file_path, $image_quality );
            break;          
        }

        case 'image/gif': {         
            // Nothing to do
            break;
        }
    }

    return $data;
}
add_filter( 'wp_handle_upload', 'wt_handle_upload_callback' );

Cela fonctionne bien, l’image originale est compressée, MAIS cette fonction supprime les données EXIF ​​/ IPTC sur toutes les images (je dois conserver EXIT, au moins sur l’image originale). Sans la fonction ci-dessus, les images d'origine et toutes les images redimensionnées sont avec des données EXIF ​​/ IPTC (car ImageMagick est installé), mais l'image d'origine n'est pas compressée.

Comment réparer, ajuster la fonction ci-dessus pour garder EXIF?

MISE À JOUR 2

WP 4.5 présente quelques améliorations d’image, ainsi que la possibilité de conserver les données EXIF ​​de l’image (dans le cas où ImageMagic est utilisé sur Host, ce qui est le cas dans mon cas). WP 4.5 a introduit le nouveau filtre "image_strip_meta" qui peut être utilisé pour conserver ou supprimer des EXIF ​​sur les images redimensionnées générées (support et vignettes).

Ce filtre peut-il être utilisé pour conserver EXIF ​​dans l'image d'origine lorsque la fonction ci-dessus pour la compression de l'image d'origine (qui supprime toutes les données EXIF ​​de la version d'origine et de toutes les images redimensionnées) est utilisée?

Ou, autre chose qui résulterait en une compression de l'image originale juste après le téléchargement et en conservant EXIF ​​dans l'image originale?

1
Advanced SEO

Le problème est que vous utilisez les fonctions de Gd library pour manipuler des images, pas les fonctions de WordPress Image API (WP_Image_Editor class) . Ainsi, les choses WordPress ne s'appliquent pas à l'image générée par votre code.

L'API WordPress Image utilise ImageMagick si disponible, sinon elle utilise la bibliothèque Gd.

Afin de conserver les données EXIF:

  1. Si la bibliothèque Gd est utilisée, vous devez installer PHP avec le EXIF ​​exension et configurer PHP avec --enable-exif indicateur .
  2. Si ImageMagick est disponible, WordPress l'utilisera et EXIF ​​et les autres métadonnées sont préservées . De plus, vous avez accès au filtre image_strip_meta (non disponible si la bibliothèque Gd est utilisée).

Comme ImageMagick est installé sur votre ordinateur, vous pouvez l’utiliser à la place de la bibliothèque Gd. Ou peut-être mieux, utilisez l'API WordPress:

add_filter( 'wp_handle_upload', 'wt_handle_upload_callback' );
function wt_handle_upload_callback( $data ) {

    // get instance of WP_Image_Editor class
    $image = wp_get_image_editor( $data['file'] );

    if( ! is_wp_error( $image ) ) {
        $image->set_quality( 85 );
        $image->save( $data['file'], $data['type'] );
    }

    return $data;
}

Je n'ai pas testé le code ci-dessus et je pense que vous n'en avez pas besoin. Si le seul but de faire tout cela est de compresser l'image, vous devez savoir que l'image est déjà compressée par WordPress à une qualité de 82% ( 90 avant WP 4.5 ). Si vous devez modifier la qualité de la compression, utilisez simplement jpeg_quality filter :

add_filter( 'jpeg_quality', 'cyb_set_jpeg_quality' );
function cyb_set_jpeg_quality() {
    return 85;
}
2
cybmeta