【发布时间】:2017-06-30 17:03:41
【问题描述】:
我正在尝试从 GD 中的动态文本数据创建图像,并将徽标放在顶角。图片的背景颜色会根据传入的数据而改变,所以我不能只将徽标保存为没有 alpha 通道的图片。
我创建了图像,使用 imagefill() 用动态背景颜色填充它,然后使用 imagettftext() 添加文本,然后加载我的徽标。我在将徽标放入图像时遇到问题而没有保留它的背景颜色为“透明”。所以我希望它后面有由 imagefill() 设置的动态背景颜色。但是,它会保留加载时使用的透明背景,因此将 png 的这一部分写为透明。我尝试在加载徽标后在徽标上调用 imagefill()(使用设置目标图像背景的相同 rgb),但这没有做任何事情。
下面是我的代码:
$background = $_GET['background'];
$data1 = $_GET['data1'];
$data2 = $_GET['data2'];
$r = $_GET['r'];
$g = $_GET['g'];
$b = $_GET['b'];
$png_image = imagecreate(400, 200);
$gd_text_color = imagecolorallocate($png_image, 255, 255, 255);
$gd_background_color = imagecolorallocate($png_image, $r, $g, $b);
imagefill($png_image, 0, 0, $gd_background);
$text1 = "test test $data1";
$text2 = "test test again $data2";
$font = 'Lato-regular.ttf';
imagettftext($png_image, 18, 0, 20, 20, $gd_text_color, $font, $text1);
imagettftext($png_image, 18, 0, 20, 50, $gd_text_color, $font, $text2);
//trying to get this logo and place it in the corner.
$logo = imagecreatefrompng("images/logo.png");
imagecopy($png_image, $logo, 10, 10, 0, 0, 100, 30);
header('Content-type: image/png');
imagepng($png_image, $filename);
imagedestroy($png_image);
这是该代码的输出:http://i.imgur.com/n25h9Js.png 下面是图像加载到接受 alpha 通道的程序时的样子:http://i.imgur.com/3OIRupN.png
有人知道我将如何实现我正在尝试的目标吗?
感谢您的宝贵时间。
编辑
为了尝试解释我想要什么,这里是另一张图片。上图是我目前得到的,下图是我想要的。我只是想加载一个可以放在不同颜色背景之上的透明 PNG。但是,我要么得到它在这里显示的方式(透明背景),要么作为黑色背景(因为我猜 alpha 通道没有被查看?)。希望这可以帮助。图片:
编辑 2
根据下面的评论,我将它从 imagecreate() 更改为 imagecreatetruecolor(),现在它可以正常工作了!如果有人有时间,我很想解释一下为什么会解决这个问题,但现在,感谢所有评论甚至花时间研究这个问题的人。
【问题讨论】:
-
我不确定您真正想要做什么 - 您是否希望最终图像具有任何透明度。但是,您的
imagecreate()可能会在创建托盘图像时给您带来问题 - 也许您需要imagecreatetruecolour()。 -
imagecreatetruecolor(不是英国版!)
-
我正在尝试创建一个没有透明度的图像,对。我想我的解释令人困惑,所以我再试一次:最终图像的背景颜色将取决于输入数据,所以我不能只创建一个与最终图像具有相同背景颜色的“徽标”图像。因此,我将其作为具有透明度的 PNG 加载。我希望将它“放置”在左上角,使其位于动态背景颜色的顶部,但是 GD 正在使图像的那部分透明,这是我不想要的。我在主帖中包含了一个屏幕截图,显示了我目前拥有的和想要的。
-
哇哦!忽略我的最后评论和我的编辑! imagecreatetruecolor() 解决了它。我把头撞在墙上大约 3 个小时,总共弄乱了 alpha 通道和 imagealphablending() 之类的函数……感谢@MarkSetchell 和@Ben-Shoval 的帮助!我仍然不明白为什么,但是现在可以了!如果您想将其添加为答案,我会将其标记为已解决。
标签: php image png transparency gd