【问题标题】:PHP GD Text with Transparency/Alpha background具有透明度/Alpha 背景的 PHP GD 文本
【发布时间】:2011-01-09 05:16:30
【问题描述】:

好吧,所以我在将我的文本放在部分透明的图像上时遇到了问题。我希望文本是实心的,但我希望图像的部分背景是透明的,而文本结束的部分是实心的,我有,问题是文本继承了其中一个的透明背景前几层。这是代码和输出示例,在该输出下我希望它看起来像什么。图像放置在浅灰色背景上,因此深灰色之间的图像周围的浅色边框是透明的,但没有其他东西应该特别是文本。似乎不是文本本身,而是文本块的背景是透明的。如您所见,这不是很理想。请帮忙,这是我完成项目剩下的唯一问题。 :)

还不能发布图片,所以这里有一个链接到示例输出和期望结果的图片 (orig):

<?php

$img = imagecreatetruecolor(200, 50);

$imageX = imagesx($img);
$imageY = imagesy($img);

imagealphablending($img, false);
imagesavealpha($img, true);

$transparent = imagecolorallocatealpha($img, 255,255,255, 127);
$white = imagecolorallocate($img, 255,255,255);
$grey = imagecolorallocate($img, 127,127,127);
imagefilledrectangle($img, 0, 0, $imageX, $imageY, $grey);
imagefilledrectangle($img, 2, 2, $imageX-4, $imageY-4, $transparent);

$font = "./arialbd.ttf";
$fontSize = 12;
$text = "THIS IS A TEST";

$textDim = imagettfbbox($fontSize, 0, $font, $text);
$textX = $textDim[2] - $textDim[0];
$textY = $textDim[7] - $textDim[1];

$text_posX = ($imageX / 2) - ($textX / 2);
$text_posY = ($imageY / 2) - ($textY / 2);

imagefilledrectangle($img, 10, 10, $imageX-10, $imageY-10, $grey);
imagettftext($img, $fontSize, 0, $text_posX, $text_posY, $white, $font, $text);

header("Content-Type: image/png");
imagepng($img);

?>

【问题讨论】:

    标签: php gd transparent imagettftext


    【解决方案1】:

    哈哈,我想我想得不够努力。解决方案是在将文本放置到图像上之前重新打开 imagealphablending。

    <?php
    
    $img = imagecreatetruecolor(200, 50);
    
    $imageX = imagesx($img);
    $imageY = imagesy($img);
    
    imagealphablending($img, false);
    imagesavealpha($img, true);
    
    $transparent = imagecolorallocatealpha($img, 255,255,255, 127);
    $white = imagecolorallocate($img, 255,255,255);
    $grey = imagecolorallocate($img, 127,127,127);
    imagefilledrectangle($img, 0, 0, $imageX, $imageY, $grey);
    imagefilledrectangle($img, 2, 2, $imageX-4, $imageY-4, $transparent);
    
    $font = "./arialbd.ttf";
    $fontSize = 12;
    $text = "THIS IS A TEST";
    
    $textDim = imagettfbbox($fontSize, 0, $font, $text);
    $textX = $textDim[2] - $textDim[0];
    $textY = $textDim[7] - $textDim[1];
    
    $text_posX = ($imageX / 2) - ($textX / 2);
    $text_posY = ($imageY / 2) - ($textY / 2);
    
    imagefilledrectangle($img, 10, 10, $imageX-10, $imageY-10, $grey);
    imagealphablending($img, true);
    imagettftext($img, $fontSize, 0, $text_posX, $text_posY, $white, $font, $text);
    
    header("Content-Type: image/png");
    imagepng($img);
    
    ?>
    

    【讨论】:

    • 实际上我有类似的问题,在添加文本之前打开 alphablend 就像一个魅力!谢谢!
    • 是的,我必须在使用imagecopyresampled() 调整大小之前将其关闭,然后在使用imagettftext() 放置文本之前重新打开以保持背景透明并避免字符周围出现灰色菱形
    猜你喜欢
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多