Estou tentando executar uma pequena função para determinar a luminosidade de uma imagem e armazená-la na pós-meta para essa imagem.
Eu tenho a função funcionando, mas gostaria de disparar quando uma imagem terminar de carregar ... alguém sabe a função / filtro / ação que eu deveria ligar para isso?
Eu olhei para
- image_attachment_fields_to_save
- attachment_fields_to_save
- wp_handle_upload
- media_upload_form_handler
- wp_generate_attachment_metadata
e eu simplesmente não consigo fazer nenhum deles simplesmente executar uma adição à tabela postmeta para a imagem
atualmente meu código é parecido com:
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);
mas isso não está funcionando.
Agradecemos antecipadamente por qualquer assistência
SOLUÇÃO Graças a 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);
isso cria um número entre 0 e 255 que representa a luminosidade da imagem. Isso é particularmente útil se você estiver colocando uma camada de texto sobre uma imagem de plano de fundo e desejar saber se a imagem é predominantemente clara ou escura.