【问题标题】:Draw color for text background PHP and GD为文本背景 PHP 和 GD 绘制颜色
【发布时间】:2011-06-14 20:44:47
【问题描述】:

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

我正在成功地将文本写入图像。
但是,我遇到了一种情况,将文本放置在矩形(或任何形状)上而不是直接放置在图像上,以便为放置图像的文本创建纯色背景可能不会让文本非常容易阅读。

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

  1. 在书写文本时用颜色填充背景
  2. 将文本写入具有纯色背景的适当大小的图像,然后将图像叠加到目标上

我不知道如何做 #1 和 #2 似乎过于复杂 我不知道如何确定文本的尺寸,以便我可以创建一个新的图像它。

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

这是我希望它的外观,在任何颜色的文本后面都有一个紧凑的框:

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

更新:

在@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

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

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

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

任何想法可能导致这种情况?极有可能是我的代码在某个地方,但除了这个错误之外,它会完全按照我的想法工作,这似乎很奇怪。

【问题讨论】:

  • 您使用什么函数将文本写入图像?使用 ttf 是一种选择吗?
  • @Dan 这当然是一个选择,虽然只是为了轻松设置,我一直在使用默认的 imagestringimagestringup编辑顺便说一句,我用的是我写的this library

标签: php background gd background-color


【解决方案1】:

在拼命寻找这个问题的答案时,我偶然发现了与我的问题相关的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);

【讨论】:

    【解决方案2】:

    如果您切换到 ttf,也许这将为您完成这项工作。 http://php.net/manual/en/function.imagettfbbox.php

    【讨论】:

    • 我以前在调整图像大小时看到过类似的东西。是否涉及任何调整大小?
    • 不调整大小。它本质上是:1) 加载 Scout,2) 使新图像与文本大小相同,3) 写入文本,4) 将文本覆盖到 Scout 图像,5) 显示组合图像。这有点让我失望:-/我希望 GD 不那么挑剔。
    猜你喜欢
    • 2015-04-21
    • 1970-01-01
    • 2019-11-26
    • 2020-04-21
    • 2018-12-25
    • 2010-12-02
    • 1970-01-01
    相关资源
    最近更新 更多