web-dev-qa-db-fra.com

accrocher dans le filtre de téléchargement d'image terminé

J'essaie de lancer une petite fonction pour déterminer la luminance d'une image et la stocker dans le postmeta pour cette image.

J'ai la fonction qui fonctionne, mais je l'aime bien se déclencher lorsqu'une image est terminée. Quelqu'un connaît-il la fonction/le filtre/l'action à laquelle je devrais m'attacher pour cela?

ive regardé

  • image_attachment_fields_to_save
  • attachment_fields_to_save
  • wp_handle_upload
  • media_upload_form_handler
  • wp_generate_attachment_metadata

et je ne peux pas sembler faire l'un d'eux simplement exécuter un ajout à la table de postmeta pour l'image

actuellement mon code ressemble à quelque chose comme:

function insert_luminance_data($post, $attachment) {
    if ( substr($post['post_mime_type'], 0, 5) == 'image' ) {
        $lum = 'TEST';
        add_post_meta( $post['ID'], 'image_lum', $lum, true ) || update_post_meta( $post['ID'], 'image_lum', $lum );
    }
    return $post;
}

add_filter('image_attachment_fields_to_save', 'insert_luminance_data', 10, 2);

mais cela ne fonctionne pas.

Merci d'avance pour toute aide


SOLUTIONMerci à s_ha_dum

function get_avg_luminance($filename, $num_samples=10) {
    $img = imagecreatefromjpeg($filename);

    $width = imagesx($img);
    $height = imagesy($img);

    $x_step = intval($width/$num_samples);
    $y_step = intval($height/$num_samples);

    $total_lum = 0;

    $sample_no = 1;

    for ($x=0; $x<$width; $x+=$x_step) {
        for ($y=0; $y<$height; $y+=$y_step) {

            $rgb = imagecolorat($img, $x, $y);
            $r = ($rgb >> 16) & 0xFF;
            $g = ($rgb >> 8) & 0xFF;
            $b = $rgb & 0xFF;

            // choose a simple luminance formula from here
            // http://stackoverflow.com/questions/596216/formula-to-determine-brightness-of-rgb-color
            $lum = ($r+$r+$b+$g+$g+$g)/6;

            $total_lum += $lum;

            $sample_no++;
        }
    }

    // work out the average
    $avg_lum  = $total_lum/$sample_no;
    return $avg_lum;
    // assume a medium gray is the threshold, #acacac or RGB(172, 172, 172)
    // this equates to a luminance of 170
}

function insert_luminance_data($post_ID) {
    $src = wp_get_attachment_image_src( $post_ID, 'large' )[0];
    $lum = get_avg_luminance($src, 10, true);
    add_post_meta( $post_ID, 'image_lum', $lum, true ) || update_post_meta( $post_ID, 'image_lum', $lum );
    return $post_ID;
}

add_filter('add_attachment', 'insert_luminance_data', 10, 2);

cela crée un nombre compris entre 0 et 255 qui représente la luminance de l'image. Cette option est particulièrement utile si vous superposez du texte sur une image d'arrière-plan et souhaitez savoir si l'image est principalement claire ou sombre.

4
haxxxton

La gestion des médias de WordPress me semble dispersée et incohérente. Je dis cela seulement pour dire que je ne peux pas promettre que cela fonctionnera dans tous les cas. Cependant, je pense que j'utiliserais le crochet add_attachment DE wp_insert_attachment .

Vous obtiendrez une identification de poste, il vous faudra donc ...

  1. récupérer l'image src avec wp_get_attachment_imge_src , probablement,
  2. récupérer l'image elle-même et la traiter (vous ne savez pas comment vous avez l'intention de le faire),
  3. et enregistrez les données supplémentaires.
4
s_ha_dum