Domanda

Ho ottenuto l'immagine in questo modo (è un grafico):

 Grafico del commercio dell'oro
(fonte: kitconet.com )

Voglio cambiare i colori, quindi il bianco è nero, la linea del grafico è azzurro, ecc. è possibile ottenere con GD e PHP?

È stato utile?

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

 inserisci qui la descrizione dell'immagine

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 ...

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