Могу ли я поменять цвета в изображении с помощью библиотеки GD в PHP?

Я получил изображение, подобное этому (это график):

График торговли золотом http://www.kitconet.com/charts/metals/platinum/tny_pt_en_caoz_2.gif

Я хочу изменить цвета, так что белый цвет черный, линия графика светло-голубая и т.д. можно ли достичь с помощью GD и PHP?

Ответ 1

Это заменит белый цвет серым цветом

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

введите описание изображения здесь

Ответ 2

У меня возникли проблемы с этим решением. Изображение не может быть истинным цветным изображением. Сначала преобразуйте его с помощью 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);

Ответ 3

Я знаю, что это поздно, и после этого факта, но я собрал script, который сделает это в немного большем масштабе. Надеюсь, кто-то, кто встретит этот пост, сможет его использовать. Требуется несколько исходных изображений, которые являются одноцветными слоями (на ваш выбор). Вы предоставляете ему цвет источника и оттенок каждого слоя, а script возвращает составное изображение (с полной прозрачностью), специально выделенное для вашего шестнадцатеричного кода.

Ознакомьтесь с приведенным ниже кодом. Более подробное объяснение можно найти на 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($_GET['color']) || strlen($_GET['color']) != 6) {
    header($_SERVER['SERVER_PROTOCOL'] . ' 400 Bad Request', true, 400);

    exit(0);
}

if (file_exists( "cache/{$_GET['color']}.png" )) {
    header( 'Content-Type: image/png' );
    readfile( "cache/{$_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( $_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/{$_GET['color']}.png" );
imagepng( $n_image );

// Free up memory
imagedestroy( $n_image );
imagedestroy( $image );

Ответ 4

Я не знаю никаких готовых функций. Но я полагаю, вы могли бы пройти через каждый пиксель изображения и изменить его цвет...

Ответ 5

Я не пробовал это сам, но вы можете посмотреть на функцию imagecolorset() в библиотеке GD. эффект, который может помочь на белом фоне.

Ответ 6

Вы можете попробовать функцию imagefilter http://lv.php.net/imagefilter - но это не даст вашему непосредственному доступу заменить один цвет другим, просто изменив компоненты r/g/b.

Решение с очень низким уровнем может быть реализовано с помощью imagesetpixel http://nl2.php.net/imagesetpixel, чтобы установить новые значения пикселей.