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);
Diese Antwort hat mir auch nach der Tat geholfen! GD ist lange auf Funktionen, aber das Dokument ist kurz an realen Beispielen. –
@IlmariKaronen: Danke –