草庐IT

PHP GD文字不流畅

coder 2024-04-23 原文

问题截图:

我正在尝试获得相同的字体质量,例如 Font Squirrel's sample fonts widget , 但字体一直很粗糙。它在 Photoshop 中很流畅。注意:“懒狗”部分不是我加粗的,它自己做的。

这是 PHP:

<?php 
putenv('GDFONTPATH=' . realpath('.'));

$font = $_GET['font'] . '.ttf';
$text = 'The Quick Brown Fox Jumps over the Lazy Dog';

// Create the image
function imageCreateTransparent($x, $y) { 
    $imageOut = imagecreate($x, $y);
    $colourBlack = imagecolorallocate($imageOut, 0, 0, 0);
    imagecolortransparent($imageOut, $colourBlack);
    return $imageOut;
}

$image = imageCreateTransparent(600, 800);

// Create some colors
$white = imagecolorallocate($image, 255, 255, 255);
$grey = imagecolorallocate($image, 128, 128, 128);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 0, 0, 399, 29, $white);



// Add the text
imagettftext($image, 20, 0, 10, 20, $black, $font, $text);
imagepng($image);
imagealphablending($image, true);
imagedestroy($image);
?>

HTML:<img src="fontgen.php?font=Aller_Rg" alt="" />

我怎样才能得到高质量的字体结果?

最佳答案

您只将背景的一部分设置为白色,其余部分是透明的。

当字体绘制在白色背景上时,黑色文本被消除锯齿,因此看起来很平滑,这导致字体周围的像素被绘制为两种颜色之间的混合,这也使字体看起来更小。

右侧没有背景颜色,因此抗锯齿功能无法正常工作。绘图算法不是在字体颜色和背景颜色之间混合,而是对任何甚至部分被字母覆盖的像素使用原始字体颜色。

这使得字母看起来“粗体”,因为边缘像素现在是黑色的,而不是灰色阴影。

正确解决此问题的方法是使用具有适当背景颜色的图像,即使该背景颜色是透明的。这使得图像库使用适当的 alpha channel (这是进行 alpha 混合的唯一明智方法)而不是使用基于索引的 alpha,其中只有一种“颜色”是透明的,而所有其他颜色都是完全不透明的。

$font = '../../fonts/Aller_Rg.ttf';
$text = 'The Quick Brown Fox Jumps over the Lazy Dog';

// Create the image
function imageCreateTransparent($x, $y) {
    $imageOut = imagecreatetruecolor($x, $y);
    $backgroundColor = imagecolorallocatealpha($imageOut, 0, 0, 0, 127);
    imagefill($imageOut, 0, 0, $backgroundColor);
    return $imageOut;
}

$image = imageCreateTransparent(600, 800);

// Create some colors
$white = imagecolorallocate($image, 255, 255, 255);
$grey = imagecolorallocate($image, 128, 128, 128);
$black = imagecolorallocate($image, 0, 0, 0);

imagefilledrectangle($image, 0, 0, 399, 29, $white);

//// Add the text
imagettftext($image, 20, 0, 10, 20, $black, $font, $text);
//imagealphablending($image, true); //not needed as we created the image with alpha
imagesavealpha($image, true);
//imagepng($image, '../../var/log/wtf5.png');
imagepng($image);
imagedestroy($image);

这将使字体大小正确,因为抗锯齿将正常工作*并且图像在适当的地方将是透明的,例如使用上面的代码创建的图像,显​​示在红色背景上。

图像中具有白色背景的部分是白色的,图像中透明的部分让红色透过,文本对两者都进行了正确的抗锯齿处理。

*假设您想对背景颜色设置的颜色进行抗锯齿处理,情况并非总是如此,但可能在这里。

关于PHP GD文字不流畅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16999811/

有关PHP GD文字不流畅的更多相关文章

  1. ruby - 如何使用文字标量样式在 YAML 中转储字符串? - 2

    我有一大串格式化数据(例如JSON),我想使用Psychinruby​​同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解

  2. ruby - 字符串文字中的转义状态作为 `String#tr` 的参数 - 2

    对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一

  3. ruby - 字符串文字前面的 * 在 ruby​​ 中有什么作用? - 2

    这段代码似乎创建了一个范围从a到z的数组,但我不明白*的作用。有人可以解释一下吗?[*"a".."z"] 最佳答案 它叫做splatoperator.SplattinganLvalueAmaximumofonelvaluemaybesplattedinwhichcaseitisassignedanArrayconsistingoftheremainingrvaluesthatlackcorrespondinglvalues.Iftherightmostlvalueissplattedthenitconsumesallrvaluesw

  4. ruby - 如何在不使用 HERE-DOCUMENT 语法的情况下在 Ruby 中制作多行字符串文字? - 2

    问题总结我想尝试使用Ruby来完成我在Python中所做的事情。在Python中它有r"""syntaxtosupportrawstrings,这很好,因为它允许将原始字符串与代码内联,并以更自然的方式连接它们,而无需特殊缩进。在Ruby中,当使用原始字符串时,必须使用其次是EOT在单独的行中,这会破坏代码布局。你可能会问,为什么不使用Ruby的%q{}?嗯,因为%q{}与Python的r"""相比有局限性因为它不会转义多个\\\并且只处理单个\.我正在动态生成Latex代码并写入一个文件,该文件稍后用pdflatex编译。Latex代码包含类似\\\的内容在许多地方。如果我使用Rub

  5. Ruby:为什么等号在文字正则表达式中会导致解析错误? - 2

    这些解析和执行良好:"=".scan(/=/)"=".scan(/=/)这会导致“未终止的正则表达式遇到文件结尾”:"=".scan/=/如果我在=之前插入一些内容,错误就会消失:"=".scan/^=/这是怎么回事? 最佳答案 我猜你正在点击thisintheparser:case'/':if(IS_BEG()){lex_strterm=NEW_STRTERM(str_regexp,'/',0);returntREGEXP_BEG;}if((c=nextc())=='='){set_yylval_id('/');lex_state

  6. ruby - ruby 中的字符串文字如何绕过 new/initialize,有没有办法对此进行检测? - 2

    今天下午我在玩一个主意,偶然发现了一些我不太明白的东西。基本上我在这个实验中试图实现的是在每次创建字符串时以某种方式知道(供以后使用,例如在某种DSL中)。以下内容适用于通过String.new创建的任何字符串:class::Stringclass例如irb>String.new("foo")initializing'foo'newing'foo'=>"foo"我想不通的是当您使用文字时如何创建String对象。例如,为什么这不经过相同的初始化和设置:irb>"literalstring"=>"literalstring"我意识到当字符串是文字时,编译器会做一些不同的事情,但它不需要初

  7. ruby-on-rails - 使用 %i 和 %I 符号数组文字 - 2

    阅读Rails问题列表后,我无法找到%i与符号数组相关的功能。这对任何人都意味着什么吗? 最佳答案 小写的%i代表Non-interpolatedArrayofsymbols,separatedbywhitespace(afterRuby2.0)另外,大写的%I表示InterpolatedArrayofsymbols,separatedbywhitespace(afterRuby2.0)插值差异示例:2.4.2:001>a=12.4.2:002>%i{onetwo#{a}+three}#Interpolationisignored=

  8. ruby - Ruby 的字符串文字并置功能的正式记录在哪里? - 2

    我最近意识到,如果您并置一系列Ruby字符串文字(例如'a'"b"'c'),则相当于这些字符串文字的串联。但是,我无法在任何地方找到这种语言功能的文档。我使用术语“并置”和“串联”进行了搜索,但只在几个StackOverflow响应中找到了对它的引用。谁能给我指出一个明确的引用? 最佳答案 更新这是nowofficiallydocumented在Ruby附带的RDoc中。更改将传播到RubyDoc下次他们构建文档时。添加的文档:Adjacentstringliteralsareautomaticallyconcatenatedbyt

  9. ruby - Ruby 2.0 中的二进制字符串文字 - 2

    当升级到Ruby2.0时,一个测试用例开始失败:expected="\xD1\x9B\x86"assert_equalexpected,actual带有以下消息:expectedbutwas.actual变量包含从外部库调用中获得的二进制字符串。问题是源文件的默认编码(以及字符串文字)changedinRuby2.0从US-ASCII到UTF-8。 最佳答案 解决方案是更改字符串文字的定义以强制执行其编码。有几个可能的选择可以做到这一点:使用Array#pack(所有版本的Ruby):expected=["d19b86"].pack

  10. ruby - 不使用字符串文字时的字符串插值 - 2

    我有一个使用字符串插值来构建错误消息的Ruby脚本。p"#{vName}isnotadefinedvariable"=>'xxxisnotadefinedvariable'另一位程序员通过并试图将字符串文字外部化到一个单独的配置文件中。当然,他没有得到替换。perr_string_from_config=>'#{vName}isnotadefinedvariable'我环顾四周,但想不出比转换为sprintf字符串并使用printf更好的办法。有谁知道如何让#{}替换在Ruby脚本中对非双引号文字的字符串起作用? 最佳答案 实际上,

随机推荐