2011-06-14 76 views
1

我遇到了GD和PHP的另一个问题。为文本背景绘制颜色PHP和GD

我已成功将文字写入图像。
但是,我遇到过将矩形(或任何形状)上的文本(而不是直接放置在图像上)放置在文本上以便为其放置图像的文本创建纯色背景可能不会让文本很容易被读取。

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

  1. 装满颜色的背景,因为它写入文本
  2. 写的文字合适大小的图像有坚实的背景,然后覆盖图像到目标

我无法弄清楚如何做到#1和#2似乎过于复杂我不知道如何来确定文本的尺寸,这样我可以创造一个新的形象。

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

bad

这里就是我想它的样子,与任何颜色的文字后面的密封箱:

better

我接受任何建议,但借鉴了飞彩无任何其他图像或hackiness显然是我的第一选择。

更新:

使用`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

任何想法可能导致这种情况?这是我的代码极其可能的地方,但看起来很奇怪,它会像我认为的那样工作,除了这个bug之外。

+0

你用什么函数写的文字你的形象?是使用ttf的一个选项? – Dan 2011-06-14 20:54:25

+0

@丹它肯定是一个选项,虽然只是简单地设置了一些东西,但我一直在使用默认的[imagestring](http://www.php.net/manual/en/function.imagestring.php)和[ imagestringup](http://www.php.net/manual/en/function.imagestringup.php)。 **编辑**的方式,我使用[这个库](https://github.com/rockerest/myframework/blob/master/backbone/ImageWrite.php),我写了。 – rockerest 2011-06-14 20:56:37

回答

2

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

我从来没有完全理解为什么当你想要透明度时告诉imagealphablendingfalse,所以我想我没有正确理解我使用的代码导致了这个问题。

在任何情况下,以下修改后的代码在我的单个测试用例中就像一个魅力。 书写文字的背景,而不强迫100%的透明度为字符框,您必须启用alpha混合ON而写作文:

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

也许这会为你做的工作,如果你切换到ttf。 http://php.net/manual/en/function.imagettfbbox.php

+0

我已更新我的问题。任何提示? – rockerest 2011-06-15 02:39:46

+0

在调整图像大小之前,我已经看过类似的东西。是否有任何调整大小? – Dan 2011-06-15 08:16:11

+0

不调整任何尺寸。它基本上是:1)Load Scout,2)使新图像成为文字的大小,3)写入文字,4)将文字覆盖到侦察图像上,5)显示组合图像。这有点让我失望: - /我希望GD不那么挑剔。 – rockerest 2011-06-15 15:00:38