【问题标题】:PHP's imagettftext creates black edges on transparent backgroundPHP imagettftext 在透明背景上创建黑边
【发布时间】:2012-10-01 12:05:45
【问题描述】:

我有这个代码:

$im = imagecreatetruecolor(70, 25);

$white = imagecolorallocate($im, 255, 255, 255);
$grey = imagecolorallocate($im, 128, 128, 128);
$black = imagecolorallocate($im, 0, 0, 0);

imagecolortransparent($im, imagecolorallocate($im, 0,0,0));

$font = 'font.ttf';

imagettftext($im, 20, 0, 3, 22, $white, $font, $randomnr);

header("Expires: Wed, 1 Jan 1997 00:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");

header ("Content-type: image/png");
imagepng($im);
imagedestroy($im);

就像我在标题中所说的那样,它会在文本周围创建一些黑边。 我也尝试了imagealphablending/imagesavealpha,我得到了相同的结果(我在透明背景上使用了白色文本,这样你就可以看到我在说什么):

更新:解决方案是:

$im = imagecreatetruecolor(70, 25);
$font = 'font.ttf';
//antialiasing:
$almostblack = imagecolorallocate($im,254,254,254); 
imagefill($im,0,0,$almostblack);
$black = imagecolorallocate($im,0,0,0); 
imagecolortransparent($im,$almostblack);

imagettftext($im, 20, 0, 3, 22, $white, $font, $randomnr);
...

【问题讨论】:

    标签: php imagettftext


    【解决方案1】:

    这样的事情应该做的工作:

    $width = 70;
    $height = 25;
    
    $im = imagecreatetruecolor($width, $height);
    
    $white = imagecolorallocate($im, 255, 255, 255);
    $grey = imagecolorallocate($im, 128, 128, 128);
    $black = imagecolorallocate($im, 221, 221, 221);
    
    imageSaveAlpha($im, true);
    imageAlphaBlending($im, false);
    
    $transparent = imageColorAllocateAlpha($im, 0, 0, 0, 127);
    imagefilledrectangle($im, 0, 0, $width-1, $height-1, $transparent);
    imageAlphaBlending($im, true);
    
    $font = 'font.ttf';
    $randomnr = "1234";
    imagettftext($im, 20, 0, 3, 22, $white, $font, $randomnr);
    
    header("Expires: Wed, 1 Jan 1997 00:00:00 GMT");
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
    header("Cache-Control: no-store, no-cache, must-revalidate");
    header("Cache-Control: post-check=0, pre-check=0", false);
    header("Pragma: no-cache");
    
    header ("Content-type: image/png");
    imagepng($im);
    imagedestroy($im);
    

    【讨论】:

      【解决方案2】:

      这就是你在这里指定的:

      imagecolortransparent($im, imagecolorallocate($im, 0,0,0));
      

      如果您想使用其他颜色作为透明,请选择其他颜色。现在你使用的是黑色。

      imagecolortransparentDocs

      同时记下该用户在同一页面上的注释:

      由于抗锯齿,带有文本的透明背景似乎效果不佳。

      【讨论】:

      • 是的,我认为抗锯齿是问题所在......有没有办法解决这个问题?我希望黑色是透明的。正如我在图片中所说的那样,它是一个带有白色文字的透明背景,所以图像应该是完全白色的。
      • 您可以尝试先用透明色填充图像。此外,当您创建输出图像时,请确保它具有 8 位 alpha 通道。
      • 如何输出8位alpha?
      • 你的搜索能力似乎很弱,早在 2009 年就有人问过这个问题:PHP gdLib 8-Bit PNG with alpha - 还要看看透明度和 alpha 之间的区别。您可能想尝试使用 alphacolor,而不是透明的。看到了吗?
      • 接受您提供的链接中的抗锯齿解决方案。
      猜你喜欢
      • 2015-04-20
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      • 2017-02-01
      • 1970-01-01
      • 2012-06-17
      • 2018-04-24
      • 2011-12-27
      相关资源
      最近更新 更多