Ho ricavato uno script di sostituzione colore perfetto da https://stackoverflow.com/a/32710756/1620626. Voglio sostituire il colore target con lo sfondo dell'immagine. L'immagine originale è in background con luce verde (rgb:0b255b1)
. Posso sostituirlo con il blu ma non ho idea di come sostituire con l'immagine. Ecco la sceneggiatura.Sostituire il colore RGB specifico con un'altra immagine utilizzando PHP
Questa è l'immagine originale.
Dopo aver elaborato questa foto con la sceneggiatura. Ci penso io.
La sceneggiatura sostituisce perfettamente il colore di destinazione con quello nuovo. Ora voglio passare dal blu allo sfondo. Quindi l'idea finale è. Questa ragazza sull'immagine di sfondo che ho scelto.
Ecco il codice:
<?php
//https://stackoverflow.com/a/32710756/1620626
function RGBtoHSL($r, $g, $b) {
$r /= 255;
$g /= 255;
$b /= 255;
$max = max($r, $g, $b);
$min = min($r, $g, $b);
$l = ($max + $min)/2;
$d = $max - $min;
if($d == 0){
$h = $s = 0;
} else {
$s = $d/(1 - abs(2 * $l - 1));
switch($max){
case $r:
$h = 60 * fmod((($g - $b)/$d), 6);
if ($b > $g) {
$h += 360;
}
break;
case $g:
$h = 60 * (($b - $r)/$d + 2);
break;
case $b:
$h = 60 * (($r - $g)/$d + 4);
break;
}
}
return array(round($h, 2), round($s, 2), round($l, 2));
}
function HSLtoRGB($h, $s, $l){
$c = (1 - abs(2 * $l - 1)) * $s;
$x = $c * (1 - abs(fmod(($h/60), 2) - 1));
$m = $l - ($c/2);
if ($h < 60) {
$r = $c;
$g = $x;
$b = 0;
} else if ($h < 120) {
$r = $x;
$g = $c;
$b = 0;
} else if ($h < 180) {
$r = 0;
$g = $c;
$b = $x;
} else if ($h < 240) {
$r = 0;
$g = $x;
$b = $c;
} else if ($h < 300) {
$r = $x;
$g = 0;
$b = $c;
} else {
$r = $c;
$g = 0;
$b = $x;
}
$r = ($r + $m) * 255;
$g = ($g + $m) * 255;
$b = ($b + $m ) * 255;
return array(floor($r), floor($g), floor($b));
}
/* ---------------CHANGE THESE------------------- */
$colorToReplace = RGBtoHSL(0,255,1);//target color
$hueAbsoluteError = 7;//the more the clearer
$replacementColor = RGBtoHSL(0, 192, 239);//new color
/* ---------------------------------------------- */
$filename = 'images/01.png';
$im = imagecreatefrompng($filename);
$out = imagecreatetruecolor(imagesx($im), imagesy($im));
$transColor = imagecolorallocatealpha($out, 254, 254, 254, 127);
imagefill($out, 0, 0, $transColor);
for ($x = 0; $x < imagesx($im); $x++) {
for ($y = 0; $y < imagesy($im); $y++) {
$pixel = imagecolorat($im, $x, $y);
$red = ($pixel >> 16) & 0xFF;
$green = ($pixel >> 8) & 0xFF;
$blue = $pixel & 0xFF;
$alpha = ($pixel & 0x7F000000) >> 24;
$colorHSL = RGBtoHSL($red, $green, $blue);
if ((($colorHSL[0] >= $colorToReplace[0] - $hueAbsoluteError) && ($colorToReplace[0] + $hueAbsoluteError) >= $colorHSL[0])){
$color = HSLtoRGB($replacementColor[0], $replacementColor[1], $colorHSL[2]);
$red = $color[0];
$green= $color[1];
$blue = $color[2];
}
if ($alpha == 127) {
imagesetpixel($out, $x, $y, $transColor);
}
else {
imagesetpixel($out, $x, $y, imagecolorallocatealpha($out, $red, $green, $blue, $alpha));
}
}
}
imagecolortransparent($out, $transColor);
imagesavealpha($out, TRUE);
header('Content-type: image/png');
imagepng($out);
?>
Il risultato è un ottimo aspetto, ma ho ottenuto l'errore 500 sul mio server. Cosa c'è che non va? http://phuket.my/irp/ – Wilf
@Wilf è necessario controllare i registri o eseguirne il debug in un altro modo, dall'errore 500 non è possibile dire qual è il problema. [Qui] (https://github.com/serebrov/so-questions/tree/master/php-image-background) è il codice completo che ho usato, scarica l'intera cartella o clona il repository, esegui come 'php convert. php> out.png', le immagini sorgente sono sotto 'images /'. –