绘制文本背景PHP和GD的颜色

时间:2011-06-14 20:44:47

标签: php background gd background-color

我遇到了GD和PHP的另一个问题。

我成功地将文字写入图像 但是,我遇到过这样一种情况,即将文本 - 而不是直接放在图像上 - 放置在矩形(或任何形状)上,以便为放置图像的文本创建可靠的背景允许非常容易地阅读文本。

我的两个想法是按照优先顺序排列:

  1. 在写入文字时用背景填充背景
  2. 将文本写入具有纯色背景的适当大小的图像,然后将图像叠加到目标
  3. 我无法弄清楚如何做#1和#2看起来过于复杂我不知道如何确定文字的尺寸以便我可以创建一个新的图像它

    为清楚起见,这里的输出不是很好:

    bad

    这就是我喜欢它的样子,在任何颜色的文字背后都有一个紧密的盒子:

    better

    我愿意接受任何建议,但在没有任何其他图像或黑客的情况下即时绘制颜色显然是我的首选。

    更新

    在@Dan建议使用`imagettftext'之后,我决定现在是时候在我的库中添加对该功能的支持了。除了一个主要问题外,一切都按预期工作。

    即使写入纯色背景(0透明度),写入图像的文本仍然是透明的。

    这是我写的测试脚本:

    <?php
        set_include_path('backbone:global:jquery');
    
        require_once('Image.php');
    
        $scout = new Image();
        $scout->source = "scout.jpg";
    
        $result = $scout->Write->Font(25, 25, "A Fairly Long String", 12, "#FF0000", 0, "LiberationSans-Regular.ttf", 1, "#FFFF00", .4, 4);
    
        if( !isset($_GET['dev']) )
        {
            header("Content-Type: " . $scout->contentType());
        }
    
        if( $result )
        {
            $scout->output();
        }
    ?>
    

    我使用/要求的文件:
    1. scout
    2. liberation font
    3.图像处理库

         - Image
         - ImageBase
         - ImageCombine
         - ImageDraw
         - ImageManipulate
         - ImageWrite

    我为所有文件道歉,它实际上只使用ImageImageBaseImageCombineImageWrite,但其他文件是require_once装载机。

    以下是上述脚本输出的示例:

    transparent text background

    这里的输出为零透明度(完全不透明):

    $result = $scout->Write->Font(25, 25, "A Fairly Long String", 12, "#FF0000", 0, "LiberationSans-Regular.ttf", 1, "#FFFF00", 1, 4);

    transparent on solid background

    任何可能导致这种情况的想法?它极其可能是我的代码在某个地方,但它似乎很奇怪它会像我想的那样工作,除了这个错误。

2 个答案:

答案 0 :(得分:2)

在拼命寻找这个问题的答案时,我偶然发现this SO question与我的问题切线相关,并且包含答案。

我从来没有完全明白为什么在需要透明度时告诉imagealphablending false,所以我想我未能正确理解我正在使用的代码导致了这个问题。

在任何情况下,以下修改后的代码在我的单个测试用例中就像一个魅力。 要在不对字符框强制100%透明的情况下将文本写入背景,您必须在编写文本时将alpha混合打开

imagealphablending($text->handle, true);
$bool = imagettftext($text->handle, $textSize, $angle, $padding, abs($size[5]) + $padding, $this->AllocateColor($rgba[0]['r'], $rgba[0]['g'], $rgba[0]['b'], $rgba[0]['alpha']), $font, $string);
imagealphablending($text->handle, false);

答案 1 :(得分:1)

如果切换到ttf,也许这可以帮到你。 http://php.net/manual/en/function.imagettfbbox.php