PHP imagettftext总是绘制黑色。

4
基本上,当我绘制文本时,它最终会变成黑色,就像这样:http://i.stack.imgur.com/z675F.png。而不是我在PHP和函数中分配的颜色。 代码:
    $finalImage = imagecreatefrompng($imageFile);
    $logo = imagecreatefrompng($logoImage);
    imagecopy($finalImage, $logo, $logoPosition['x'], $logoPosition['y'], 0, 0, imagesx($logo), imagesy($logo));
    $font = "arial.ttf";
    $fontSize = 10;
    $yOffSet = 15;
    $white = imagecolorallocate($finalImage, 255, 255, 255);
    foreach($pixelArray as $key => $x) {
        foreach($valueArray[$key] as $valueText) {

            imagettftext($finalImage, $fontSize, 0, $x, $yOffSet, $white, $font, $valueText);
            $yOffSet += 15;
        }
        $yOffSet = 15;
    }
    if($miscText != null) {
        foreach($miscText as $key => $text) {
            imagettftext($finalImage, $fontSize, 0, $text['x'], $text['y'], $white, $font, $text['text']);    
        }
    }
    imagepng($finalImage,$saveFileName.".png");
    imagedestroy($finalImage);

之前它可以工作,但是突然间就停止了,我不知道为什么。这是在我更改了源图像(生成正常)之后发生的,而我没有触摸代码。我尝试了各种颜色的更改,但我无法使其显示除黑色外的任何其他颜色。

3个回答

5

我通过将imagecolorallocate更改为imagecolorclosest来解决了问题,因为我已经复制了一个带有白色文本的标志:

//       imagecolorallocate....
$white = imagecolorclosest($im, 255, 255, 255); 

3

你是否检查了imagecolorallocate()函数是否返回布尔值false?如果分配失败,它将返回false。如果$finalImage.png是8位,并且你的纯白色在源图像的调色板中不存在,这个调用将会失败。你说你改变了源图像,所以这很可能是它现在失效的原因。

$white = imagecolorallocate($finalImage, 255, 255, 255);
if ($white === FALSE) { // note the === -> strict type comparison
    die("Failed to allocate color 255/255/255")
}

该函数还会简单地返回表示颜色三元组的数字,例如此例中为0xFFFFFF。您可以尝试直接将其传递到imagegetttftext()调用中,看看是否有帮助。

我尝试使用0xFFFFFF,但它完全停止了文本的显示。我没有想到要检查分配限制,所以我会检查一下。我也相当确定这不是图片的问题,因为我再次尝试将背景涂成黑色,但仍然存在问题。好的,是的,它无法分配。我有一个包含白色文本的标志,我将其写入图像中,可以正确显示。有没有办法我可以使用那个白色? - UberMouse
如果调色板已满,并且不包含纯白色,则必须使用imagecolordeallocate()(删除)其中一种现有颜色以释放一个插槽以供纯白色使用。 - Marc B

0
使用 imagecreatetruecolor() 函数来分配颜色:
$width = 500; //whatever width you need
$height = 200; //whatever height you need
$white = imagecolorallocate(imagecreatetruecolor($width, $height), 255, 255, 255);

那对我起作用了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接