2009-01-18 5 views

Antwort

38

Dies wird die weiße Farbe mit Grau

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

enter image description here

+4

Diese Antwort hat mir auch nach der Tat geholfen! GD ist lange auf Funktionen, aber das Dokument ist kurz an realen Beispielen. –

+0

@IlmariKaronen: Danke –

0

Mir sind keine vorgefertigten Funktionen bekannt. Aber ich nehme an, du könntest durch jedes Pixel des Bildes gehen und seine Farbe ändern ...

0

Ich habe es nicht selbst ausprobiert, aber du kannst die Funktion imagecolorset() in der GD-Bibliothek ansehen Es tut eine Farbe Fülle wie Effekt, das könnte mit dem weißen Hintergrund helfen.

0

Sie könnten versuchen, die Imagefilter-Funktion http://lv.php.net/imagefilter - aber das wird nicht Ihren direkten Zugriff auf eine Farbe durch eine andere zu ersetzen, nur die R/G/B-Komponenten ändern.

Eine sehr Low-Level-Lösung könnte implementiert werden unter Verwendung von imagesetpixel http://nl2.php.net/imagesetpixel, um die neuen Pixelwerte festzulegen.

7

Ich hatte Probleme machen diese Lösung Arbeit ersetzen. Das Bild kann kein echtes Farbbild sein. Konvertiere es zuerst mit 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

Ich weiß, das Ende ist und nach der Tat, aber ich habe einen Skript zusammen, dass diese auf einem etwas größeren Maßstab tun wird. Hoffentlich kann jemand, der auf diesen Beitrag stößt, ihn benutzen. Es braucht eine Anzahl von Quellbildern, die einfarbige Ebenen sind (Ihre Wahl). Sie stellen ihm eine Quellfarbe und den Farbton jeder Ebene zur Verfügung, und das Skript gibt ein zusammengesetztes Bild (mit voller Transparenz) zurück, das speziell für Ihren bereitgestellten Hex-Code farbig ist.

Überprüfen Sie den folgenden Code. Eine detailliertere Erklärung finden Sie auf meiner 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); 
Verwandte Themen