Skip to main content
updated with solution
Source Link
haxxxton
  • 153
  • 1
  • 8

SOLUTION Thanks to 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);

this creates a number between 0 and 255 that represents the luminance of the image.. this is particularly useful if you are layering text over a background image and wish to know if the image is mostly light or mostly dark.


SOLUTION Thanks to 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);

this creates a number between 0 and 255 that represents the luminance of the image.. this is particularly useful if you are layering text over a background image and wish to know if the image is mostly light or mostly dark.

Source Link
haxxxton
  • 153
  • 1
  • 8

hook into completed image upload filter

I'm trying to run a little function to determine the luminance of an image and store that in the postmeta for that image..

I have the function working, but id like it to fire when an image has finished uploading.. does anyone know the function/filter/action i should hook into for this?

ive looked at

  • image_attachment_fields_to_save
  • attachment_fields_to_save
  • wp_handle_upload
  • media_upload_form_handler
  • wp_generate_attachment_metadata

and i just cant seem to make any of them simply run an addition to the postmeta table for the image

currently my code looks something like:

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);

but this isnt working.

Thanks in advance for any assistance