Posso scambiare i colori nell'immagine usando la libreria GD in PHP?
-
19-08-2019 - |
Domanda
Ho ottenuto l'immagine in questo modo (è un grafico):
(fonte: kitconet.com )
Voglio cambiare i colori, quindi il bianco è nero, la linea del grafico è azzurro, ecc. è possibile ottenere con GD e PHP?
Soluzione
Questo sostituirà il colore bianco con il grigio
$imgname = "test.gif";
$im = imagecreatefromgif ($imgname);
$index = imagecolorclosest ( $im, 255,255,255 ); // get White COlor
imagecolorset($im,$index,92,92,92); // SET NEW COLOR
$imgname = "result.gif";
imagegif($im, $imgname ); // save image as gif
imagedestroy($im);
Altri suggerimenti
Ho avuto problemi a far funzionare questa soluzione. L'immagine non può essere una vera immagine a colori. Convertire prima con imagetruecolortopalette ();
$imgname = "test.gif";
$im = imagecreatefromgif ($imgname);
imagetruecolortopalette($im,false, 255);
$index = imagecolorclosest ( $im, 255,255,255 ); // get White COlor
imagecolorset($im,$index,92,92,92); // SET NEW COLOR
$imgname = "result.gif";
imagegif($im, $imgname ); // save image as gif
imagedestroy($im);
So che è tardi e dopo il fatto, ma ho messo insieme uno script che lo farà su una scala leggermente più grande. Eventualmente qualcuno che si imbatte in questo post può usarlo. Prende un numero di immagini di origine che sono livelli di un colore (a scelta). Gli fornisci un colore sorgente e la tinta di ogni livello e lo script restituisce un'immagine composita (con piena trasparenza) colorata in modo specifico per il tuo codice esadecimale fornito.
Controlla il codice qui sotto. Una spiegazione più dettagliata può essere trovata sul mio blog .
function hexLighter($hex, $factor = 30) {
$new_hex = '';
$base['R'] = hexdec($hex{0}.$hex{1});
$base['G'] = hexdec($hex{2}.$hex{3});
$base['B'] = hexdec($hex{4}.$hex{5});
foreach ($base as $k => $v) {
$amount = 255 - $v;
$amount = $amount / 100;
$amount = round($amount * $factor);
$new_decimal = $v + $amount;
$new_hex_component = dechex($new_decimal);
$new_hex .= sprintf('%02.2s', $new_hex_component);
}
return $new_hex;
}
// Sanitize/Validate provided color variable
if (!isset( So che è tardi e dopo il fatto, ma ho messo insieme uno script che lo farà su una scala leggermente più grande. Eventualmente qualcuno che si imbatte in questo post può usarlo. Prende un numero di immagini di origine che sono livelli di un colore (a scelta). Gli fornisci un colore sorgente e la tinta di ogni livello e lo script restituisce un'immagine composita (con piena trasparenza) colorata in modo specifico per il tuo codice esadecimale fornito.
Controlla il codice qui sotto. Una spiegazione più dettagliata può essere trovata sul mio blog .
<*>GET['color']) || strlen( So che è tardi e dopo il fatto, ma ho messo insieme uno script che lo farà su una scala leggermente più grande. Eventualmente qualcuno che si imbatte in questo post può usarlo. Prende un numero di immagini di origine che sono livelli di un colore (a scelta). Gli fornisci un colore sorgente e la tinta di ogni livello e lo script restituisce un'immagine composita (con piena trasparenza) colorata in modo specifico per il tuo codice esadecimale fornito.
Controlla il codice qui sotto. Una spiegazione più dettagliata può essere trovata sul mio blog .
<*>GET['color']) != 6) {
header( So che è tardi e dopo il fatto, ma ho messo insieme uno script che lo farà su una scala leggermente più grande. Eventualmente qualcuno che si imbatte in questo post può usarlo. Prende un numero di immagini di origine che sono livelli di un colore (a scelta). Gli fornisci un colore sorgente e la tinta di ogni livello e lo script restituisce un'immagine composita (con piena trasparenza) colorata in modo specifico per il tuo codice esadecimale fornito.
Controlla il codice qui sotto. Una spiegazione più dettagliata può essere trovata sul mio blog .
<*>SERVER['SERVER_PROTOCOL'] . ' 400 Bad Request', true, 400);
exit(0);
}
if (file_exists( "cache/{ So che è tardi e dopo il fatto, ma ho messo insieme uno script che lo farà su una scala leggermente più grande. Eventualmente qualcuno che si imbatte in questo post può usarlo. Prende un numero di immagini di origine che sono livelli di un colore (a scelta). Gli fornisci un colore sorgente e la tinta di ogni livello e lo script restituisce un'immagine composita (con piena trasparenza) colorata in modo specifico per il tuo codice esadecimale fornito.
Controlla il codice qui sotto. Una spiegazione più dettagliata può essere trovata sul mio blog .
<*>GET['color']}.png" )) {
header( 'Content-Type: image/png' );
readfile( "cache/{ So che è tardi e dopo il fatto, ma ho messo insieme uno script che lo farà su una scala leggermente più grande. Eventualmente qualcuno che si imbatte in questo post può usarlo. Prende un numero di immagini di origine che sono livelli di un colore (a scelta). Gli fornisci un colore sorgente e la tinta di ogni livello e lo script restituisce un'immagine composita (con piena trasparenza) colorata in modo specifico per il tuo codice esadecimale fornito.
Controlla il codice qui sotto. Una spiegazione più dettagliata può essere trovata sul mio blog .
<*>GET['color']}.png" );
exit(0);
}
// Desired final size of image
$n_width = 50;
$n_height = 50;
// Actual size of source images
$width = 125;
$height = 125;
$image = imagecreatetruecolor($width, $height);
imagesavealpha($image, true);
imagealphablending($image, false);
$n_image = imagecreatetruecolor($n_width, $n_height);
imagesavealpha($n_image, true);
imagealphablending($n_image, false);
$black = imagecolorallocate($image, 0, 0, 0);
$transparent = imagecolorallocatealpha($image, 255, 255, 255, 127);
imagefilledrectangle($image, 0, 0, $width, $height, $transparent);
$layers = array();
$layers_processed = array();
$layers[] = array( 'src' => 'layer01.gif', 'level' => 0 ); // Border
$layers[] = array( 'src' => 'layer02.gif', 'level' => 35 ); // Background
$layers[] = array( 'src' => 'layer03.gif', 'level' => 100 ); // White Quotes
foreach ($layers as $idx => $layer) {
$img = imagecreatefromgif( $layer['src'] );
$processed = imagecreatetruecolor($width, $height);
imagesavealpha($processed, true);
imagealphablending($processed, false);
imagefilledrectangle($processed, 0, 0, $width, $height, $transparent);
$color = hexLighter( So che è tardi e dopo il fatto, ma ho messo insieme uno script che lo farà su una scala leggermente più grande. Eventualmente qualcuno che si imbatte in questo post può usarlo. Prende un numero di immagini di origine che sono livelli di un colore (a scelta). Gli fornisci un colore sorgente e la tinta di ogni livello e lo script restituisce un'immagine composita (con piena trasparenza) colorata in modo specifico per il tuo codice esadecimale fornito.
Controlla il codice qui sotto. Una spiegazione più dettagliata può essere trovata sul mio blog .
<*>GET['color'], $layer['level'] );
$color = imagecolorallocate($image,
hexdec( $color{0} . $color{1} ),
hexdec( $color{2} . $color{3} ),
hexdec( $color{4} . $color{5} )
);
for ($x = 0; $x < $width; $x++)
for ($y = 0; $y < $height; $y++)
if ($black === imagecolorat($img, $x, $y))
imagesetpixel($processed, $x, $y, $color);
imagecolortransparent($processed, $transparent);
imagealphablending($processed, true);
array_push($layers_processed, $processed);
imagedestroy( $img );
}
foreach ($layers_processed as $processed) {
imagecopymerge($image, $processed, 0, 0, 0, 0, $width, $height, 100);
imagedestroy( $processed );
}
imagealphablending($image, true);
imagecopyresampled($n_image, $image, 0, 0, 0, 0, $n_width, $n_height, $width, $height);
imagealphablending($n_image, true);
header( 'Content-Type: image/png' );
imagepng( $n_image, "cache/{ So che è tardi e dopo il fatto, ma ho messo insieme uno script che lo farà su una scala leggermente più grande. Eventualmente qualcuno che si imbatte in questo post può usarlo. Prende un numero di immagini di origine che sono livelli di un colore (a scelta). Gli fornisci un colore sorgente e la tinta di ogni livello e lo script restituisce un'immagine composita (con piena trasparenza) colorata in modo specifico per il tuo codice esadecimale fornito.
Controlla il codice qui sotto. Una spiegazione più dettagliata può essere trovata sul mio blog .
<*>GET['color']}.png" );
imagepng( $n_image );
// Free up memory
imagedestroy( $n_image );
imagedestroy( $image );
Non l'ho provato io stesso ma puoi guardare la funzione imagecolorset () nella libreria GD Fa un effetto simile al riempimento di colore, che potrebbe aiutare con lo sfondo bianco.
Potresti provare la funzione imagefilter http://lv.php.net/imagefilter - ma che non ti darà l'accesso diretto per sostituire un colore con un altro, cambiando semplicemente i componenti r / g / b.
Una soluzione di livello molto basso potrebbe essere implementata usando imagesetpixel http://nl2.php.net/imagesetpixel per impostare i nuovi valori di pixel.
IMG_FILTER_NEGATE: inverte tutti i colori dell'immagine.
http://www.php.net/manual/en/function. imagefilter.php
Potrebbe essere una soluzione?
L'approccio lento ma sicuro, che scorre su ogni pixel.
function ReplaceColour($img, $r1, $g1, $b1, $r2, $g2, $b2)
{
if(!imageistruecolor($img))
imagepalettetotruecolor($img);
$col1 = (($r1 & 0xFF) << 16) + (($g1 & 0xFF) << 8) + ($b1 & 0xFF);
$col2 = (($r2 & 0xFF) << 16) + (($g2 & 0xFF) << 8) + ($b2 & 0xFF);
$width = imagesx($img);
$height = imagesy($img);
for($x=0; $x < $width; $x++)
for($y=0; $y < $height; $y++)
{
$colrgb = imagecolorat($img, $x, $y);
if($col1 !== $colrgb)
continue;
imagesetpixel ($img, $x , $y , $col2);
}
}
Non sono a conoscenza di alcuna funzione pronta. Ma suppongo che potresti passare attraverso ogni pixel dell'immagine e cambiarne il colore ...