百科狗-知识改变命运!
--

imagepstext() - gd函数(图像处理)

是丫丫呀12个月前 (11-21)阅读数 12#技术干货
文章标签字体

imagepstext()

(PHP 4, PHP 5)

用 PostScript Type1 字体把文本字符串画在图像上

说明

imagepstext(resource $image,string $text,resource $font_index,int $size,int $foreground,int $background,int $x,int $y[,int $space= 0[,int $tightness= 0[,float $angle= 0.0[,int $antialias_steps= 4]]]]): array

用 PostScript Type1 字体把文本字符串画在图像上。

如果不很理解请参考 PostScript 文档中关于字体及其度量系统的部分。

参数

$image

由图象创建函数(例如imagecreatetruecolor())返回的图象资源。

$text

要写入的文本。

$font_index

imagepsloadfont()返回的字体资源。

$size

$size以像素来表达。

$foreground

写入的字体的颜色。

$background

文本以防锯齿(antialiasing)方式尝试淡入的颜色。以$background为颜色的像素实际上不会被画上去,所以背景图像不需要是实心的颜色。

$x

第一个字符的左下角起点 x 坐标。

$y

第一个字符的左下角 y 坐标。

$space

$space可以用来改变字体中默认间距的值。此值将被加到通常的值上,可以为负值。以字符间距单元表示,1 个单元为 1 em-square 的一千分之一。

$tightness

$tightness可以控制字符之间的间距。此值将被加到通常字符宽度上Z,可以为负值。以字符间距单元表示,1 个单元为 1 em-square 的一千分之一。

$angle

imagepstext() - gd函数(图像处理)

$angle以角度表示。

$antialias_steps

可以控制防混色文本使用的颜色的数目。允许值为 4 和 16。大的数值推荐用于大小小于 20 的文本,对文本质量的效果相当明显。对更大的大小,用 4,计算强度小一些。

返回值

本函数返回一个包含下列单元的数组:

0左下角的 X 坐标
1左下角的 Y 坐标
2右上角的 X 坐标
3右上角的 Y 坐标

范例

imagepstext()用法

注释

Note:此函数仅在 PHP编译时指定了--with-t1lib[=DIR]时可用。

参见

  • imagepsbbox()给出一个使用 PostScript Type1 字体的文本方框
imagepstext() appears to be quite memory intensive and we had a problem where about 50% of the time the script would error. You need to make sure PHP has enough memory assigned to it - we had to increase PHP's allocation from 8MB to 16MB for a simple "hello world" example to work smoothly. 
If the png header was commented out it would sometimes error with a message like: 
Warning: imagepstext() [function.imagepstext]: T1Lib Error 11 or 14
and if the png header was there it would sometimes say: 
The image [...] cannot be displayed, because it contains errors.
As of PHP 5.2.13 with bundled GD (2.0.34) antialiasing_steps mustn't be "4 to 16", but "4 or 16". Values from 5 to 15 result in a warning.
The documentation above is bad. It says $font:
"Can be 1, 2, 3, 4, 5 for built-in fonts in latin2 encoding (where higher numbers corresponding to larger fonts) or any of your own font identifiers registered with imageloadfont()."
But it can't. When I put in 1,2,3,4,5 I get
"Warning: imagepstext() expects parameter 3 to be resource, integer given"
I get the same thing when using imageloadfont() because imageloadfont() also returns an integer. The documentation should instead say: 
"resource returned from imagepsloadfont()."
The coordinates given by x, y represent actually a starting point of the text baseline. They represent the lower left corner of the first character only in case that any part of the character doesn't lie below baseline (it works for "Hello" but for "Howdy" it does not - because of letter y). There may be some small differences according to the font and size chosen.
If you use fonts with special chars, remeber to read in the encoded file *.enc with imagepsencodefont ... etc. for Danish, Swedish, German.....
a note on kernnig:
t1lib tries to load a corresponding afm file in the directory of the font file.
it does this by replacing the extension (.PFB .pfb) with ".afm". note that this has to be a lowercase afm! usually windows-ps-fonts have file names in all-uppercase, so try renaming the *.AFM file to *.afm.
i also noticed that sometimes this gives an error -2. it seems like t1lib chokes on windows-linebreaks in the afm file.
try 'recode dos..lat1 fontfile.afm' and check again.
if it all works, combinations like "Ta" or "Te" should show the second letter slightly moved to the capital T (on normal fonts like Times anyway).
If you have a programming error in your code, using ImagePsText, sometimes t1lib crashes with an unrecoverable error. Because of this, httpd needs to be restarted. 
This problem only occurs if there is a programming error, but can drive you crazy when debugging, if you don't know about it. By killing the parent process(httpd) you "reset" t1lib. When debugging, if you get an error then make a code change, restart httpd before testing it again. This will save hours of frustration. Make it a habit to just restart httpd after every error, and you will be much happier.
Also, to see debugging messages, (if you are rendering x's) comment the jpeg header, and the ImageJpeg statement. You will get beautiful error messages. When you get a blank page, your ImagePsText code is working correctly. Uncomment the Header() and ImageJpeg() and see what you have. You might be passing parameters that render a white image with no text, but the code is working!
Numeric t1lib error messages can be decoded using the t1lib_doc.pdf file that comes with t1lib. PHP simply relays these errors from t1lib to the page. Please don't ask the PHP people about these errors... t1lib has beautiful documentation.... use it: )
thx,
Neil
It is important so make shure that the "text" really is a string.
imagepstext ($im, $text, $font, $textsize, $black, $white, 10, 10);
won't work if $text is undefined, so PHP will quit with an error.
so always write it like this:
imagepstext ($im, "$text", $font, $textsize, $black, $white, 10, 10);
One other thing... variables. It is important to convert variables to the proper type before they hit this function. In this respect, ImageTtfText is easier to work with. IE, if you pass a font size from one page to the next, via GPC, it becomes a string type. Sooo... use IntVal() to convert it to an integer type that ImagePsText can digest. In addition you must convert HTML special characters or use chr() to represent special characters. ImagePsFont will not decode   to represent a space, use Chr(32) or a space:

thx,
Neil
I found a way to let imagepstext understand 32-bit colors (RGBA) by replacing in gd.c:PHP_FUNCTION(imagepstext)
int _fg, _bg, x, y, size, space = 0, aa_steps = 4, width = 0;
with
unsigned int _fg, _bg, x, y, size, space = 0, aa_steps = 4, width = 0;
with a font included in t1lib:

Better than using freetype, but with freetype2, the difference is marginal. To flip backround and foreground colors, alternate the order of ImageColorAllocate statements.
 
If you get outlines (the antialiasing produces these) reverse the $black and $white color identifiers in the ImagePsText function.
Happy PostScripting!
thx,
Neil
I made a function that makes it easy to align text to the right
of an image. Below you can find the code because for me it
works great. You can also use it to center text as well, if you 
like to have that simply remove the -10 and split the result
of $imgwidth and $texwidth
function AlignRight($string, $font, $imgwidth, $fontsize) {
list($lx,$ly,$rx,$ry) = imagepsbbox($string,$font,$fontsize,0,0,0);
$textwidth = $rx - $lx;
$imw = ($imgwidth-10-$textwidth);
return $imw;
}
内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)