Domanda

Nel PHP GD come è possibile convertire un TrueColor immagine ad un tavolozza senza perdere qualsiasi colori. Con imagetruecolortopallete è non funziona . Ho una funzione che attraversa tutti i colori e filtri di loro (ad es. In scala di grigi). e It non trattiene tutti i colori , come ad esempio questa foto di una Lamborghini -

foto

alt text

Questa è il mio codice

$im = imagecreatefrompng("lamborghini.png");
$degrees = 0;

$img = imagecreatetruecolor(imagesx($im), imagesy($im));
imagecopy($img, $im, 0, 0, 0, 0, imagesx($im), imagesy($im));
imagetruecolortopalette($img, true, 256);
$t = imagecolorstotal($img);
for ($i = 0; $i < $t; $i++) {
  $rgb = imagecolorsforindex($img, $i);
  $hsv =rgbtohsv($rgb['red'], $rgb['green'], $rgb['blue']);
  $h = $degrees;
  $s = $hsv['s'];
  $v = $hsv['v'];
  while ($h > 360) {$h -= 360;};
        $nrgb = hsvtorgb($h, $s, $v);
  imagecolorset($img, $i, $nrgb['r'], $nrgb['g'], $nrgb['b']);
}
imagecopy($im, $img, 0, 0, 0, 0, imagesx($img), imagesy($img));

header('Content-type: image/png');

imagepng($im);
imagedestroy($im);

Ed appare come questa

alt text

Si può vedere perde i colori . C'è qualsiasi soluzione

Anche io non credo che abbia a che fare con il mio codice, ma come imagetruecolortopalette lo emette

È stato utile?

Soluzione

Controlla il ritorno sul imagecolorstotal, si è sempre trovato 256 colori come il ritorno, non importa quanto in alto si imposta il numero di colori da dithering a. PNG-8 e GIF supportano solo le palette di fino a 256 colori. Quindi, anche se è possibile utilizzare più di 256 in una tavolozza, che avrebbe dovuto salvarlo nuovamente come vero colore per chiunque di essere in grado di usarlo, rendendo così l'intero processo di conversione di una perdita di tempo. In altre parole imagetruecolortopallete ha un limite superiore di 256 colori, non si può andare più in alto.

Ecco come si può fare in TrueColor, anche se è ad alta intensità di risorse. Forse guardare in ImageMagick, se si vuole fare questo in modo più efficiente.

$im = imagecreatefrompng("lamb.png");
$img = imagecreatetruecolor(imagesx($im), imagesy($im));
$degrees = 0;
if ($degrees > 360) {$degrees = $degrees % 360 ;}

foreach (range(0, imagesx($im) - 1) as $x ) {
    foreach (range(0, imagesy($im) - 1) as $y) {
        $rgb = imagecolorat($im, $x, $y);
        $r = ($rgb >> 16) & 0xFF;
        $g = ($rgb >> 8) & 0xFF;
        $b = $rgb & 0xFF;
        $hsv = rgbtohsv($r,$g,$b);
        $rgb = hsvtorgb($degrees, $hsv['s'], $hsv['v']);
        imagesetpixel($img, $x,$y,imagecolorallocate($img, $rgb['r'], $rgb['g'], $rgb['b']));
    }
}

imagepng($img, 'lamb2.png');

Modifica: Aggiunta rgbtohsv e funzioni hsvtorgb. Non ho scritto queste funzioni.

function rgbtohsv ($R, $G, $B) {
 // HSV Results:Number 0-1
$HSL = array();

$var_R = ($R / 255);
$var_G = ($G / 255);
$var_B = ($B / 255);

$var_Min = min($var_R, $var_G, $var_B);
$var_Max = max($var_R, $var_G, $var_B);
$del_Max = $var_Max - $var_Min;

$V = $var_Max;

if ($del_Max == 0)
{
$H = 0;
$S = 0;
}
else
{
$S = $del_Max / $var_Max;

$del_R = ( ( ( $var_Max  - $var_R ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;
$del_G = ( ( ( $var_Max  - $var_G ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;
$del_B = ( ( ( $var_Max  - $var_B ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;

if ($var_R == $var_Max) $H = $del_B - $del_G;
else if ($var_G == $var_Max) $H = ( 1 / 3 ) + $del_R - $del_B;
else if ($var_B == $var_Max) $H = ( 2 / 3 ) + $del_G - $del_R;

if ($H<0) $H++;
if ($H>1) $H--;
}

$HSL['h'] = $H;
$HSL['s'] = $S;
$HSL['v'] = $V;

return $HSL;
}

function hsvtorgb ($H, $S, $V) 
{
$RGB = array();

if($S == 0)
{
$R = $G = $B = $V * 255;
}
else
{
$var_H = $H * 6;
$var_i = floor( $var_H );
$var_1 = $V * ( 1 - $S );
$var_2 = $V * ( 1 - $S * ( $var_H - $var_i ) );
$var_3 = $V * ( 1 - $S * (1 - ( $var_H - $var_i ) ) );

if ($var_i == 0) { $var_R = $V ; $var_G = $var_3 ; $var_B = $var_1 ; }
else if ($var_i == 1) { $var_R = $var_2 ; $var_G = $V ; $var_B = $var_1 ; }
else if ($var_i == 2) { $var_R = $var_1 ; $var_G = $V ; $var_B = $var_3 ; }
else if ($var_i == 3) { $var_R = $var_1 ; $var_G = $var_2 ; $var_B = $V ; }
else if ($var_i == 4) { $var_R = $var_3 ; $var_G = $var_1 ; $var_B = $V ; }
else { $var_R = $V ; $var_G = $var_1 ; $var_B = $var_2 ; }

$R = $var_R * 255;
$G = $var_G * 255;
$B = $var_B * 255;
}

$RGB['r'] = $R;
$RGB['g'] = $G;
$RGB['b'] = $B;

return $RGB;
}

Altri suggerimenti

conversione TrueColor a palette sta andando sempre di coinvolgere i colori di perdere, a meno che il vostro tavolo pallette è grande abbastanza per contenere ogni colore unico nell'immagine. La Lamborghini può benissimo avere più di (diciamo) 255 tonalità di colore giallo da solo, e gli slot tavolozza allora ancora bisogno per il resto dell'immagine in cima a quello. Ecco perché c'è immagini TrueColor. Non c'è tavolozza, ma ogni pixel può avere una propria terna RGB dedicato al più accuratamente rappresentare la scena originale.

Detto questo, non riesco a vedere come la conversione di un'immagine TrueColor cambierà giallo al rosso, come nelle immagini di esempio. Come stai facendo esattamente questa conversione tavolozza? Campionamento ogni pixel e facendo una sorta di trasformazione su di esso?

Che ne dite di questa funzione: http://www.php.net/ manuale / it / function.imagetruecolortopalette.php . Si potrebbe prendere un po 'di scherzi con il numero di colori per farlo bene, però.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top