it-swarm.com.de

hängen Sie sich in den abgeschlossenen Bild-Upload-Filter ein

Ich versuche, eine kleine Funktion auszuführen, um die Luminanz eines Bildes zu bestimmen und diese in der Postmeta für dieses Bild zu speichern.

Ich habe die Funktion funktioniert, aber ich möchte, dass sie ausgelöst wird, wenn ein Bild hochgeladen wurde. Kennt jemand die Funktion/den Filter/die Aktion, in die ich mich einhängen sollte?

ich habe angeschaut

  • image_attachment_fields_to_save
  • attachment_fields_to_save
  • wp_handle_upload
  • media_upload_form_handler
  • wp_generate_attachment_metadata

und ich kann einfach nicht scheinen, irgendwelche von ihnen einfach einen Zusatz zur Postmetatabelle für das Bild laufen zu lassen

derzeit sieht mein Code ungefähr so ​​aus:

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

aber das funktioniert nicht.

Vielen Dank im Voraus für jede Hilfe


LÖSUNGDanke an 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);

dadurch wird eine Zahl zwischen 0 und 255 erstellt, die die Luminanz des Bildes darstellt. Dies ist besonders nützlich, wenn Sie Text über ein Hintergrundbild legen und wissen möchten, ob das Bild überwiegend hell oder überwiegend dunkel ist.

4
haxxxton

Das Media-Handling von WordPress erscheint mir verstreut und inkonsistent. Ich sage das, nur um zu sagen, dass ich nicht versprechen kann, dass dies in allen Fällen funktionieren wird. Ich denke jedoch, ich würde den add_attachment -HOOK VON wp_insert_attachment verwenden.

Sie erhalten einen Post-ID, so müssen Sie ...

  1. rufe das Bild src mit wp_get_attachment_imge_src auf, wahrscheinlich,
  2. rufen Sie das Bild selbst ab und verarbeiten Sie es (nicht sicher, wie Sie das vorhaben).
  3. und speichern Sie die zusätzlichen Daten.
4
s_ha_dum