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

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

График торговли золотом http://img.ruphp.com/php/tny_pt_en_caoz_2.gif

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

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

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

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

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

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

Ознакомьтесь с приведенным ниже кодом. Более подробное объяснение можно найти в моем блоге .

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

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

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

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

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

IMG_FILTER_NEGATE: Изменяет все цвета изображения.

http://www.php.net/manual/en/function.imagefilter.php

Может ли это быть решением?