【问题标题】:Load transparent png into gd php but don't make it's background transparent将透明png加载到gd php中,但不要使其背景透明
【发布时间】: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


【解决方案1】:

我怀疑您的 imagecreate() 可能会给您带来问题,因为它会创建一个调色板图像,它不具备真彩色图像的灵活性或表达范围。

我建议你用imagecreatetruecolor()替换它。

【讨论】:

    猜你喜欢
    • 2015-04-20
    • 2013-02-21
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多