8545 sujets

Développement web côté serveur, CMS

utilisé une base de donnée, et une table intermediaire qui lie les tableaux à des couleurs dominante choisir pour ton clients.
Bonsoir, Jencal, et merci de ta fidélité.

Les images sont dans un répertoire, et les descriptions, dans une base de données.

L'idéé, c'est de ne rien avoir à ajouter à la base de données. De trouver un manière que PHP ou JS détecte automatiquement la couleur dominante.
Voilà le genre de script que je recherche :

$source_file = "test_image.jpg";
//histogram options
$maxheight = 300;
$barwidth = 2;
$im = ImageCreateFromJpeg($source_file);
$imgw = imagesx($im);
$imgh = imagesy($im);
//n = total number or pixels
$n = $imgw*$imgh;
$histo = array();
for ($i=0; $i<$imgw; $i++)
{
for ($j=0; $j<$imgh; $j++)
{
//get the rgb value for current pixel
$rgb = ImageColorAt($im, $i, $j);
//extract each value for r, g, b
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
//get the Value from the RGB value
$V = round(($r + $g + $b) / 3);
//add the point to the histogram
$histo[$V] += $V / $n;
}
}
//find the maximum in the histogram in order to display a normated graph
$max = 0;
for ($i=0; $i<255; $i++)
{
if ($histo[$i] > $max)
{
$max = $histo[$i];
}
}
Je ne résiste pas plus longtemps à la satisfaction narcissique de vous soumettre le fruit de mes cogitations vespérales :

ini_set( "display_errors" , TRUE ) ; error_reporting( E_ALL ) ;

$image = ImageCreateFromJpeg( "chauffe-eau.jpg" ) ;
$rouges = $verts = $bleus = array() ; 

$width = imagesx( $image ) ;
$height = imagesy( $image ) ;
 
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 ;
}

$nombre = $width * $height ;

$rouge = round( array_sum( $rouges ) / $nombre ) ;
$vert = round(  array_sum( $verts ) / $nombre ) ;
$bleu = round(  array_sum( $bleus ) / $nombre ) ;

$couleur = "rgb( $rouge, $vert, $bleu )" ; 

echo "<hr style=\"width:1cm; height:1cm; background:$couleur;\" />" ;  


Des réactions ?
Un chouia plus élaboré; sous forme de fonction :

function dominanteextraire( $path )
{
$image = ImageCreateFromJpeg( $path ) ;
$rouges = $verts = $bleus = array() ; 

$width = imagesx( $image ) ;
$height = imagesy( $image ) ;
 
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 ;
}

$nombre = $width * $height ;

$rouge = round( array_sum( $rouges ) / $nombre ) ;
$vert = round(  array_sum( $verts ) / $nombre ) ;
$bleu = round(  array_sum( $bleus ) / $nombre ) ;

return "rgb( $rouge, $vert, $bleu )" ; 
}


A vos tests !!!

Et bonne nuit...
Lister les jpg proches d'une couleur donnée ( $rouge, $vert, $bleu ) :

function pericolorlister( $liste, $rouge, $vert, $bleu )
{
$files = $bornes = array() ; 

$colors = array( "rouge", "vert", "bleu" ) ; 
foreach( $colors as $color ) $bornes[$color] = array( $$color * .9, $$color * 1.1 ) ;

foreach( $liste as $file )
{
$image = ImageCreateFromJpeg( "Paints/$file" ) ;
$width = imagesx( $image ) ;
$height = imagesy( $image ) ;
 
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 ;
}

$nombre = $width * $height ;
$rouge = round( array_sum( $rouges ) / $nombre ) ;
$vert = round(  array_sum( $verts ) / $nombre ) ;
$bleu = round(  array_sum( $bleus ) / $nombre ) ;

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

return implode( SPACE, $files ) ; // exploitable par un fetch JS ;
}


Qu'en pensez-vous ?
L'étape d'après :

function pericolorlister( $liste, $path, $rouge, $vert, $bleu )
{
$files = $bornes = $rouges = $verts = $bleus = array() ; $delta = 25 ; 

$colors = array( "rouge", "vert", "bleu" ) ; 
foreach( $colors as $color ) $bornes[$color] = array( $$color-$delta, $$color+$delta ) ;

foreach( $liste as $file )
{
$image = ImageCreateFromJpeg( "$path/$file" ) ;
$width = imagesx( $image ) ;
$height = imagesy( $image ) ;
 
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 ;
}

$nombre = $width * $height ;
$rouge = round( array_sum( $rouges ) / $nombre ) ;
$vert = round(  array_sum( $verts ) / $nombre ) ;
$bleu = round(  array_sum( $bleus ) / $nombre ) ;

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[] = tag( $file, "li" ) ;
}

return tag( "liste des images proches de la couleur indiquée", "h3" ).tag( $files, "ol" ) ;
}


Et la fonction tag :


function tag()
{
$arguments = func_get_args() ;
$curseur = trim( is_array( $arguments[0] ) ? join( NL, $arguments[0] ) : $arguments[0] ) ;
$intercalaire = pallsdenombrer( $curseur ) || strlen( $curseur ) > 200 ? NL : VIDE ;

foreach( $arguments as $no => $argument ) if( $no && $argument )
{
$commentaire = VIDE ;
$attributs = explode( SPACE, $argument ) ; 
if( ! defined( "??" ) ) define( "??", TRUE ) ; 

foreach( $attributs as $no => $attribut ) 
if( $no && $attribut ) { $commentaire = ?? ? commenter( $attribut ) : VIDE ; break ; }

$curseur = LT.$argument.GT.$intercalaire.$curseur.$intercalaire.LT.SLASH.$attributs[0].GT.$commentaire ;
}

return $curseur ;
}