gpt4 book ai didi

php - 使用 php GD 库将透明渐变与图像混合

转载 作者:行者123 更新时间:2023-12-04 15:55:00 24 4
gpt4 key购买 nike

我尝试在需要从全色到透明的图像上渲染渐变,这是我的代码。我得到黑色图像,如果我把 start 设置为 0,我得到白色渐变但没有图像。输出图像为 338x100 像素,但如果图像较窄,则输入图像需要右对齐。

function hex2rgb($hex) {
$rgb[0] = hexdec(substr($hex, 0, 2));
$rgb[1] = hexdec(substr($hex, 2, 2));
$rgb[2] = hexdec(substr($hex, 4, 2));
return $rgb;
}

function int2rgb($color) {
$result[] = ($color >> 16) & 0xFF;
$result[] = ($color >> 8) & 0xFF;
$result[] = $color & 0xFF;
return $result;
}

if (isset($_GET['start']) && isset($_GET['stop']) && isset($_GET['color'])) {
$input = imagecreatefrompng('file.png');
$width = imagesx($input);
$output = imagecreatetruecolor(338, 100);
$color = hex2rgb($_GET['color']);
$fill = imagecolorallocate($output, $color[0], $color[1], $color[2]);


for ($x=0; $x<$_GET['start']; ++$x) {
for ($y=0; $y<100; ++$y) {
imagesetpixel($output, $x, $y, $fill);
}
}
$range = $_GET['stop']-$_GET['start'];
for ($x=$_GET['start']; $x<$_GET['stop']; ++$x) {
$alpha = round(255-($x*255/$range));
$correct_x = $width < 338 ? $x+$width-338 : $x;
for ($y=0; $y<100; ++$y) {
$input_color = int2rgb(imagecolorat($input, $correct_x, $y));

$new_color = imagecolorallocate($output,
(($color[0]-$alpha)*$input_color[0])/255,
(($color[1]-$alpha)*$input_color[1])/255,
(($color[2]-$alpha)*$input_color[2])/255);
imagesetpixel($output, $x, $y, $new_color);
}
}
if ($_GET['stop']<338) {
$stop = $width < 338 ? $_GET['stop']+$width-338 : $_GET['stop'];
imagecopy($input, $output, $stop, 0, $_GET['stop'], 0, 338-$stop, 100);
header('Content-Type: image/png');
imagepng($output);
}
}

我使用 gradient.php?start=20&stop=200&color=ff0000 运行脚本,得到的不是红色渐变。

enter image description here enter image description here

如何使渐变红色从全色变为全透明?所以它看起来像这样:

enter image description here

最佳答案

如果您使用 imagecreatetruecolor 创建图像它有一个黑色的背景。使用 imagefill您可以轻松更改图像的背景。 imagecolorallocatealpha函数让您创建一种包含透明度的颜色。 127表示完全透明,0表示不透明。

它现在可以工作了,我稍微简化了你的代码:

function hex2rgb($hex) {
$rgb[0] = hexdec(substr($hex, 0, 2));
$rgb[1] = hexdec(substr($hex, 2, 2));
$rgb[2] = hexdec(substr($hex, 4, 2));
return $rgb;
}

if (isset($_GET['start']) && isset($_GET['stop']) && isset($_GET['color'])) {
$color = hex2rgb($_GET['color']);
$range = $_GET['stop']-$_GET['start'];

// create input image
$input = imagecreatefrompng('file.png');


// create output image
$height = imagesy($input);
$width = imagesx($input);
$output = imagecreatetruecolor($width, $height);

// put a transparent background on it
$trans_colour = imagecolorallocatealpha($output, 0, 0, 0, 127);
imagefill($output, 0, 0, $trans_colour);

// create the gradient
for ($x=0; $x < $width; ++$x) {
$alpha = $x <= $_GET['start'] ? 0 : round(min(($x - $_GET['start'])/$range, 1)*127);
$new_color = imagecolorallocatealpha($output, $color[0], $color[1], $color[2], $alpha);
imageline($output, $x, $height, $x, 0, $new_color);
}

// copy the gradient onto the input image
imagecopyresampled($input, $output, 0, 0, 0, 0, $width, $height, $width, $height);

// output the result
header('Content-Type: image/png');
imagepng($input);
}

关于php - 使用 php GD 库将透明渐变与图像混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14684622/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com