2016-09-22 6 views
1

Le code ci-dessous (la plupart du temps à partir d'ici) créera du texte dans la couleur de l'image tant que l'image est une couleur unie. Je veux être capable de créer le texte quand l'image n'est pas une couleur, comme si c'était l'image d'une brique où la surface a des couleurs différentes et aléatoires. J'ai trouvé du code ici où chaque pixel de la source peut être lu mais ensuite il fusionne ceux-ci et cela ne donne pas une vraie reproduction. Est-ce possible>Obtention de valeurs RVB à partir d'une image avec des couleurs différentes

$im = imagecreatefrompng('green.png'); 
    $rgb = imagecolorat($im, 4,4); 
    $r = ($rgb >> 16) & 0xFF; 
    $g = ($rgb >> 8) & 0xFF; 
    $b = $rgb & 0xFF; 

    echo '<div style="font-size:60px;color:rgb(' .$r .','.$g.','.$b.')">Text in color of the Image</div>'; 
+0

Vous souhaitez écrire en rouge sur des images rouges? Comment cela sera-t-il utile? –

Répondre

0

Au lieu d'un échantillon, j'ai prélevé 10 échantillons et fait la moyenne de la couleur. Vous pouvez essayer avec encore plus d'échantillons.

 <?php 
    $im = imagecreatefrompng('images/green.png'); 

    $width = imagesx($im); 
    $height = imagesy($im);   

    $hpart = round($width/5); // divide image in five columns 
    $vpart = round($height/2); // divide image in two rows 


    $r = 0; 
    $g = 0; 
    $b = 0; 

    $rarr = array(); 
    $garr = array(); 
    $barr = array(); 


    for($i=0; $i<5; $i++) { 
     $sampleh = round($hpart/2) + ($hpart*$i); 
     $samplev = round($vpart/2); 

     $rgb = imagecolorat($im, $sampleh,$samplev); 
     $r += ($rgb >> 16) & 0xFF; 
     $g += ($rgb >> 8) & 0xFF; 
     $b += $rgb & 0xFF;   

     $rarr[] = ($rgb >> 16) & 0xFF; 
     $garr[] = ($rgb >> 8) & 0xFF; 
     $barr[] = $rgb & 0xFF; 

    } 

    for($i=0; $i<5; $i++) { 
     $sampleh = round($hpart/2) + ($hpart*$i); 
     $samplev = round($vpart/2) + $vpart; 

     $rgb = imagecolorat($im, $sampleh,$samplev); 
     $r += ($rgb >> 16) & 0xFF; 
     $g += ($rgb >> 8) & 0xFF; 
     $b += $rgb & 0xFF;  

     $rarr[] = ($rgb >> 16) & 0xFF; 
     $garr[] = ($rgb >> 8) & 0xFF; 
     $barr[] = $rgb & 0xFF;    

    }   

    $r = round($r/10); 
    $g = round($g/10); 
    $b = round($b/10); 

    // echo "$r , $g, $b <br/>\n";   

    //  $rgb = imagecolorat($im, 4,4); 
    //  $r = ($rgb >> 16) & 0xFF; 
    //  $g = ($rgb >> 8) & 0xFF; 
    //  $b = $rgb & 0xFF; 
    //  echo "$r , $g, $b <br/>\n";  

    echo "<div> <img src='images/green.png' border=1 /></div><br/>\n"; 
    echo '<div style="font-size:60px;color:rgb(' .$r .','.$g.','.$b.')">Text in color of the Image</div>'; 

    $text = "Text in color of the Image"; 
    $coloredText = ""; 
    $j = 0; 

    for($i=0; $i<strlen($text); $i++) { 
     $coloredText .= '<span style="color:rgb(' .$rarr[$j] .','.$garr[$j].','.$barr[$j].')">'.$text[$i].'</span>'; 
     $j++; 
     if($j === 10) { 
      $j=0; 
     } 
    } 

    echo "<div style='font-size:60px;'>$coloredText </div>\n"; 
    ?> 
+0

Merci pour le code mais il ne fait pas ce que je veux pour une raison quelconque. L'image que j'utilise est 220x220 et est une image de l'ardoise, donc c'est gris avec du blanc mélangé. Quand je cours votre code, l'image est toujours grise. J'ai essayé de changer le nombre dans les boucles for, le nombre de boucles for et les numéros de colonnes et de lignes mais le résultat est toujours le texte en gris. Le code comme show donne une couleur de 152, 156, 156. Si je double les échantillons, il devient 151, 155, 155. Une idée de ce que je pourrais manquer? – user3052443

+0

J'ai édité la réponse. J'ai changé la couleur de chaque lettre du texte en fonction de chaque échantillon de l'image. J'espère que la solution est un peu meilleure .. –

+0

J'ai essayé la dernière approche et si j'ai augmenté l'échantillon, il a changé la couleur dans les taches. Mais je cherche à faire en sorte que chaque lettre utilise l'image. Idéalement, si je pouvais créer une image transparente et la remplir avec l'image d'arrière-plan, je ferais ce que je veux. J'ai donc changé le code pour essayer de le faire mais ça ne marche pas. Des idées? Je ne peux pas poster le code que j'ai trouvé. Dois-je ouvrir un autre thread pour cela? – user3052443