Bonjour, les Alsanautes !!!
Je reviens à la charge, sur ce thème, qui n'est pas résolu. Je vous rappelle que la demande du client est que le visiteur puisse lister les images proches d'une couleur donnée. Voici ma dernière ponte :
<?php
ini_set( "display_errors" , TRUE ) ; error_reporting( E_ALL ) ;
foreach( $_POST as $nom => $value ) $$nom = $value ;
$couleurs = array(
"rouge" => hexdec( substr( $couleur, 1, 2 ) ),
"vert" => hexdec( substr( $couleur, 3, 2 ) ),
"bleu" => hexdec( substr( $couleur, 5, 2 ) ),
) ;
if( ! $precision ) $precision = 0 ; $bornes = array() ; $delta = 255 / ( $precision + 1 ) ;
foreach( $couleurs as $nom => $value ) $bornes[$nom] = array( $value-$delta, $value+$delta ) ;
$files = array() ; $dirpath = "../Paints" ; $scandir = scandir( $dirpath ) ;
for( $n=1, $size=count($scandir), $max=$size/9; $n<$size ; )
{
$n += mt_rand( 1, $max ) ; if( isset( $scandir[$n] ) ) $file = $scandir[$n] ; else break ;
$image = ImageCreateFromJpeg( "$dirpath/$file" ) ;
$width = imagesx( $image ) ;
$height = imagesy( $image ) ;
$total = $width * $height ;
if( $total < 2500000 )
{
$rouges = $verts = $bleus = array() ;
for( $x=0; $x<$width; $x++ ) for( $y=0; $y<$height; $y++ )
{
$rgb = ImageColorAt( $image, $x, $y ) ;
$rouges[] = ( $rgb >> 16 ) & 0xFF ;
$verts[] = ( $rgb >> 8 ) & 0xFF ;
$bleus[] = $rgb & 0xFF ;
}
$rouge = array_sum( $rouges ) / $total ;
$vert = array_sum( $verts ) / $total ;
$bleu = array_sum( $bleus ) / $total ;
if(
$rouge > $bornes["rouge"][0] && $rouge < $bornes["rouge"][1]
&& $vert > $bornes["vert"][0] && $vert < $bornes["vert"][1]
&& $bleu > $bornes["bleu"][0] && $bleu < $bornes["bleu"][1]
)
$files[] = $file ;
}
}
echo join( "|||", $files ) ;
?>
Il y a un premier problème, grave, mais qui concerne, avant tout, le client : ses images sont trop grosses. De plus, il y en a 600. D'où l'idée de n'en considérer qu'un échantillon; environ un dixième.
Envie d'en dire ?
https://grom.doobee.fun/?search-form Modifié par dagobert (23 Sep 2022 - 11:58)