imagestring

(PHP 4, PHP 5, PHP 7, PHP 8)

imagestring水平绘制字符串

描述

imagestring(
    GdImage $image,
    GdFont|int $font,
    int $x,
    int $y,
    string $string,
    int $color
): bool

在给定的坐标处绘制一个 string

参数

image

一个 GdImage 对象,由一个图像创建函数返回,例如 imagecreatetruecolor()

font

可以是 1、2、3、4、5,代表 latin2 编码的内置字体(数字越大,字体越大),也可以是 GdFont 实例,由 imageloadfont() 返回。

x

左上角的 x 坐标。

y

左上角的 y 坐标。

string

要写入的字符串。

color

使用 imagecolorallocate() 创建的颜色标识符。

返回值

成功时返回 true,失败时返回 false

变更日志

版本 描述
8.1.0 font 参数现在接受 GdFont 实例和 int;以前只接受 int
8.0.0 image 现在期望一个 GdImage 实例;以前,期望一个有效的 gd resource

范例

范例 #1 imagestring() 范例

<?php
// 创建一个 100*30 的图像
$im = imagecreate(100, 30);

// 白色背景和蓝色文字
$bg = imagecolorallocate($im, 255, 255, 255);
$textcolor = imagecolorallocate($im, 0, 0, 255);

// 在左上角写入字符串
imagestring($im, 5, 0, 0, 'Hello world!', $textcolor);

// 输出图像
header('Content-type: image/png');

imagepng($im);
imagedestroy($im);
?>

上面的例子将输出类似于

Output of example : imagestring()

参见

添加备注

用户贡献的备注 31 备注

keksnicoh at googlemail dot com
15 年前
imagestring 的一些趣味

此函数是时间过多的一种产物。
它打开一个图像,并创建一个新的图像,使用一个字母而不是一个像素。

<?php
error_reporting
(E_ALL);
/**
* 使用字符而不是像素生成图像
*
* @param string $url 文件路径或 URL
* @param string $chars 用于替换像素的字符
* @param int $shrpns 锐度 (2 = 每隔一个像素,1 = 每个像素 ... )
* @param int $size
* @param int $weight 字体粗细/大小
* @return sesource
* @author Nicolas 'KeksNicoh' Heimann <www.salamipla.net>
* @date 02nov08
*/
function pixelfuck($url, $chars='ewk34543§G§$§$Tg34g4g', $shrpns=1, $size=4,$weight=2)
{
list(
$w, $h, $type) = getimagesize($url);
$resource = imagecreatefromstring(file_get_contents($url));
$img = imagecreatetruecolor($w*$size,$h*$size);

$cc = strlen($chars);
for(
$y=0;$y <$h;$y+=$shrpns)
for(
$x=0;$x <$w;$x+=$shrpns)
imagestring($img,$weight,$x*$size,$y*$size, $chars{@++$p%$cc}, imagecolorat($resource, $x, $y));
return
$img;
}

$url = 'http://upload.wikimedia.org/wikipedia/commons/b/be/Manga_Icon.png';
$text = 'I-dont-like-manga-...-Why-do-they-have-such-big-eyes? Strange-...-WHAT-WANT-YOU-DO?';

Header('Content-Type: image/png');
imagepng(pixelfuck($url, $text, 1, 6));
?>

玩得开心!:)
Booteille
9 年前
这是一个与 imagestring() 声明类似的函数,但它处理空格(它创建新行和 4 个空格而不是 \n 和 \t),并限制图像的大小。

<?php

/**
* @author Booteille
*
* @param resource $image
* @param int $font
* @param int $x
* @param int $y
* @param string $string
* @param int $color
*/
function whitespaces_imagestring($image, $font, $x, $y, $string, $color) {
$font_height = imagefontheight($font);
$font_width = imagefontwidth($font);
$image_height = imagesy($image);
$image_width = imagesx($image);
$max_characters = (int) ($image_width - $x) / $font_width ;
$next_offset_y = $y;

for(
$i = 0, $exploded_string = explode("\n", $string), $i_count = count($exploded_string); $i < $i_count; $i++) {
$exploded_wrapped_string = explode("\n", wordwrap(str_replace("\t", " ", $exploded_string[$i]), $max_characters, "\n"));
$j_count = count($exploded_wrapped_string);
for(
$j = 0; $j < $j_count; $j++) {
imagestring($image, $font, $x, $next_offset_y, $exploded_wrapped_string[$j], $color);
$next_offset_y += $font_height;

if(
$next_offset_y >= $image_height - $y) {
return;
}
}
}
}

?>
jordanslost at gmail
14 年前
这是一个我为了从右到左写入图像而制作的小片段,当你只能使用 imagestring() 时。

<?php

$pageview_letters
= preg_split('//', $string, -1 ); // 形成原始字母数组。
$minus = 6; // 字母间距(以像素为单位)
$first = true; // 是否已开始字符串
$x = 375; // imagestring 的 X 位置
$y = 23; // imagestring 的 Y 位置
$letters = array(); // 初始化字母数组。

foreach ( $pageview_letters as $letter ) {

$letters[] = $letter;

}

$letters = array_reverse( $letters );

foreach (
$letters as $letter ) {

if (
$first ) {

imagestring( $image, 2, $x, $y, $letter, $light_blue );
$first = false;

} else {

$x = ( $x - $minus );
imagestring( $image, 2, $x, $y, $letter, $light_blue );

}

}
?>
eviloverlord+php at gmail dot com
16 年前
一个简单的脚本,用于将字符串(例如电子邮件地址)转换为透明图像。

用法
<img src="stringtoimg.php?string=<?= urlencode(base64_encode($email)) ?>">

从垃圾邮件机器人的角度来看,他们看到
<img src="stringtoimg.php?string=ZpbXZG92ZXJsb3JkQGdtYWlsLmNvbQ%3D%3D">

可选参数
font_size:1 到 5,默认值为 3。
R/G/B:字体颜色,以十六进制表示。

用法
<img src="stringtoimg.php?string=<?= urlencode(base64_encode($email)) ?>&font_size=4&R=FF&G=FF&B=00">

<?php
/*
文件名:stringtoimg.php

参数:
string:要打印的字符串
font_size(可选):字体大小,范围为 1-5
R/G/B(可选):字体的 RGB 颜色,以十六进制表示
*/

header ("Content-type: image/png");

// 获取字符串信息
$font_size = isset($_GET['font_size']) ? $_GET['font_size'] : 3;
$string = urldecode(base64_decode($_GET['string']));

// 获取字符串的大小
$width = imagefontwidth($font_size) * strlen($string);
$height = imagefontheight($font_size);

// 创建图像
$img = @imagecreatetruecolor($width, $height)
or die(
"无法初始化新的 GD 图像流");

// 使其透明
imagesavealpha($img, true);
$trans_colour = imagecolorallocatealpha($img, 0, 0, 0, 127);
imagefill($img, 0, 0, $trans_colour);

// 获取文本颜色
$text_color = isset($_GET['R'], $_GET['G'], $_GET['B']) ?
imagecolorallocate($img, hexdec($_GET['R']), hexdec($_GET['G']), hexdec($_GET['B'])) :
imagecolorallocate($img, 0, 0, 0);

// 绘制字符串
imagestring($img, $font_size, 0, 0, $string, $text_color);

// 输出图像
imagepng($img);
imagedestroy($img);
?>
gannon (at) portablesofdoom (dot) org
17 年前
与“tjpoe at cableaz dot com”的文本换行函数相比,我更喜欢这个函数,因为它可以将文本换行以适合宽度(根据需要自动调整高度),而不仅仅是每行一个词。

function make_wrapped_txt($txt, $color=000000, $space=4, $font=4, $w=300) {
if (strlen($color) != 6) $color = 000000;
$int = hexdec($color);
$h = imagefontheight($font);
$fw = imagefontwidth($font);
$txt = explode("\n", wordwrap($txt, ($w / $fw), "\n"));
$lines = count($txt);
$im = imagecreate($w, (($h * $lines) + ($lines * $space)));
$bg = imagecolorallocate($im, 255, 255, 255);
$color = imagecolorallocate($im, 0xFF & ($int >> 0x10), 0xFF & ($int >> 0x8), 0xFF & $int);
$y = 0;
foreach ($txt as $text) {
$x = (($w - ($fw * strlen($text))) / 2);
imagestring($im, $font, $x, $y, $text, $color);
$y += ($h + $space);
}
header('Content-type: image/jpeg');
die(imagejpeg($im));
}
Piotr dot Sulecki at traxelektronik dot pl
17 年前
内置字体以前使用的是拉丁文 2 (iso8859-2) 编码。一段时间以来,它们使用的是拉丁文 1 (iso8859-1) 编码。完全无法更改编码。如果您需要使用其他编码,则必须使用 TrueType 字体。
deejay_world at yahoo dot com
22 年前
在使用 ImageString 时,您绘制的字符串不会自动换行到图像边缘。您可以使用此函数自动换行它们。

function ImageStringWrap($image, $font, $x, $y, $text, $color, $maxwidth)
{
$fontwidth = ImageFontWidth($font);
$fontheight = ImageFontHeight($font);

if ($maxwidth != NULL) {
$maxcharsperline = floor($maxwidth / $fontwidth);
$text = wordwrap($text, $maxcharsperline, "\n", 1);
}

$lines = explode("\n", $text);
while (list($numl, $line) = each($lines)) {
ImageString($image, $font, $x, $y, $line, $color);
$y += $fontheight;
}
}

因此,特别是,如果您想将文本换行到图像边缘,您可以执行
ImageStringWrap($img, $font, 0, $y, $text, $color, ImageSX($img) );
aly at slo-igre dot net
19 年前
"tjpoe at cableaz dot com" 的函数 ImageStringWrap 中存在错误。代替

else
$string = $text;

应该有

else
$string = array($text);

这样函数才能对只有一个单词的字符串起作用。否则它运行起来就很完美,谢谢。
sk89q
16 年前
创建一个文本框。具有水平和垂直对齐、框参数和自定义行间距。实际上,我在 2003 年将它提交到手册中,但它在一两年后消失了(不知道为什么)。这里又有了。

<?php
define
("ALIGN_LEFT", "left");
define("ALIGN_CENTER", "center");
define("ALIGN_RIGHT", "right");
define("VALIGN_TOP", "top");
define("VALIGN_MIDDLE", "middle");
define("VALIGN_BOTTOM", "bottom");

function
imagestringbox(&$image, $font, $left, $top, $right, $bottom, $align, $valign, $leading, $text, $color)
{
// 获取框的大小
$height = $bottom - $top;
$width = $right - $left;

// 将文本拆分为行,并放入数组中
$lines = wordwrap($text, floor($width / imagefontwidth($font)), "\n", true);
$lines = explode("\n", $lines);

// 其他重要数字
$line_height = imagefontheight($font) + $leading;
$line_count = floor($height / $line_height);
$line_count = ($line_count > count($lines)) ? (count($lines)) : ($line_count);

// 循环遍历行
for ($i = 0; $i < $line_count; $i++)
{
// 垂直对齐
switch($valign)
{
case
VALIGN_TOP: // 顶部
$y = $top + ($i * $line_height);
break;
case
VALIGN_MIDDLE: // 中间
$y = $top + (($height - ($line_count * $line_height)) / 2) + ($i * $line_height);
break;
case
VALIGN_BOTTOM: // 底部
$y = ($top + $height) - ($line_count * $line_height) + ($i * $line_height);
break;
default:
return
false;
}

// 水平对齐
$line_width = strlen($lines[$i]) * imagefontwidth($font);
switch(
$align)
{
case
ALIGN_LEFT: // 左边
$x = $left;
break;
case
ALIGN_CENTER: // 居中
$x = $left + (($width - $line_width) / 2);
break;
case
ALIGN_RIGHT: // 右边
$x = $left + ($width - $line_width);
break;
default:
return
false;
}

// 绘制
imagestring($image, $font, $x, $y, $lines[$i], $color);
}

return
true;
}
?>
wheberson dot com dot br at gmail dot com
5 年前
// 将电子邮件转换为图像 (png)
function convertEmailToImg ($aValue, $aRed, $aGreen, $aBlue, $aAlphaF=0, $aAlphaB=127, $aFontSize=4)

{
$img= imagecreatetruecolor (imagefontwidth ($aFontSize) * strlen ($aValue), imagefontheight ($aFontSize));
imagesavealpha ($img, true);
imagefill ($img, 0, 0, imagecolorallocatealpha ($img, 0, 0, 0, $aAlphaB));
imagestring ($img, $aFontSize, 0, 0, $aValue, imagecolorallocatealpha ($img, $aRed, $aGreen, $aBlue, $aAlphaF));
ob_start ();
imagepng ($img);
imagedestroy ($img);
return base64_encode (ob_get_clean ());
}

// 示例
$imgString= convertEmailToImg ('[email protected]', 0, 0, 255, 0, 127, 4);
jlamer
17 年前
// 使用示例...

// 这是一个将文本输出到图像的简单函数
// 居中(尽可能地通过肉眼进行)
// 并换行
// 请记住,所有大小都是猜测的
// 不会在空格处剪裁(只在字符数处剪裁)
// 或者更改文本颜色,但这并非用于此...
function imageCenterString( $imgw, $imgh,
$image_text = '', $text_size=5 )
{
$im = imagecreate( $imgw, $imgh );

// 白色背景和蓝色文本
$bg = imagecolorallocate($im, 255, 255, 255);
$textcolor = imagecolorallocate($im, 0, 0, 0);

$t_h = $t_w = $t_x = $t_y = 0;
$base_w =9; $base_h = 16;
$m = 0.88;
switch ( $text_size )
{
case 1: $t_w = $base_w*pow(($m*.98),4);
$t_h = $base_h*pow(($m*.98),4);
break;
case 2: $t_w = $base_w*pow($m,3);
$t_h = $base_h*pow($m,3);
break;
case 3: $t_w = $base_w*pow($m,2);
$t_h = $base_h*pow($m,2);
break;
case 4: $t_w = $base_w*$m;
$t_h = $base_h*$m;
break;
case 5: $t_w = $base_w;
$t_h = $base_h;
break;
default
if ( $text_size >= 5 ) // 设置为 5
{ $t_w = $base_w; $t_h = $base_h; }
if ( $text_size < 5 ) // 设置为 1
{
$t_w = $base_w*pow(($m*.98),4);
$t_h = $base_h*pow(($m*.98),4);
}
break;
}

$text_array = array();

$max = floor($imgw/$t_w);

for( $i=0; strlen($image_text) > 0; $i += $max)
{
array_push($text_array, substr($image_text,0,$max));
if ( strlen($image_text) >= $max )
{ $image_text = substr($image_text,$max); }
else
{ $image_text = ''; }
}

$t_y = ($imgh/2) - ($t_h*count($text_array)/2);

foreach ( $text_array as $text )
{
$t_x = ($imgw/2)-($t_w*strlen($text)/2);
imagestring($im, $text_size, $t_x, $t_y,
$text, $textcolor);
$t_y += $t_h;
}

// 输出图像
header("Content-type: image/gpeg");
imagejpeg($im);
}
cesargus at yahoo dot com
19 年前
// 简单的 hello world

<?
header ("Content-type: image/png");

$img_handle = ImageCreate (200, 20) or die ("无法创建图像");
$back_color = ImageColorAllocate ($img_handle, 0, 10, 10);
$txt_color = ImageColorAllocate ($img_handle, 235, 235, 51);
ImageString ($img_handle, 10, 25, 5, "Hello world!", $txt_color);
ImagePng ($img_handle);
?>
mustafa at hafunny dot info
16 年前
如果您在使用中欧文字时遇到问题,例如:ľščťžýáíéúäňôď,我会尝试使用 iconv() 函数解决此问题。

<?php
// 创建示例图像
$im = imagecreate(200, 20);
$bg = imagecolorallocate($im, 255, 255, 255);
$textcolor = imagecolorallocate($im, 0, 0, 255);
$text = "ľščťžýáíéúäňôď...";

// 简单字符串转换
$string = iconv("Windows-1250", "Latin2", $text);

// 将转换后的字符串写入左上角
imagestring($im, 4, 0, 0, $string, $textcolor);

// 输出图像
header("Content-type: image/png");
imagepng($im);
?>
iibm at free dot fr
17 年前
我修改了一下 (非常实用的) imagestringcutted 函数 (当 align=center 时,如果 x1!=0,它对我来说效果不好),所以只需将最后一行替换为

<?php
[...]
else
imagestring($img,$font,$x1+($x2-$x1)/ 2 - strlen($text) * $fontwidth / 2,$y,$text,$color);
}
?>
webmaster at acdrifter dot com
19 年前
如果你想将文本居中,可以使用以下函数;我不能保证它完美无缺……

function imagecenteredstring ( &$img, $font, $xMin, $xMax, $y, $str, $col ) {
$textWidth = imagefontwidth( $font ) * strlen( $str );
$xLoc = ( $xMax - $xMin - $textWidth ) / 2 + $xMin + $font;
imagestring( $img, $font, $xLoc, $y, $str, $col );
}
php dot net at mvoncken dot nl
21 年前
一个简单的例子
为了让一行文本适合图像。

<?php
header
("Content-type: image/png");
$string = "[email protected]";
$font = 4;
$width = ImageFontWidth($font) * strlen($string);
$height = ImageFontHeight($font);

$im = @imagecreate ($width,$height);
$background_color = imagecolorallocate ($im, 255, 255, 255); //白色背景
$text_color = imagecolorallocate ($im, 0, 0,0);//黑色文本
imagestring ($im, $font, 0, 0, $string, $text_color);
imagepng ($im);
?>

我使用类似的方法来保护我的访问者免受垃圾邮件的侵害 (将用户 ID 作为 URL 参数传递给此 PHP)
mike at mike-griffiths dot co dot uk
15 年前
我使用 imagechar 函数创建图像字符串,创建了另一种方法。下面的函数用于创建一个与文本字符串高度和宽度相同的图像。在我的网站上,它被用于掩盖用户的电子邮件地址。

<?PHP

// 以某种方式设置你的字符串
$string = '[email protected]';

// 设置字体大小
$font_size = 4;

// 创建取决于字符串宽度的图像宽度
$width = imagefontwidth($font_size)*strlen($string);
// 将高度设置为字体的 height
$height = imagefontheight($font_size);
// 创建图像调色板
$img = imagecreate($width,$height);
// 灰色背景
$bg = imagecolorallocate($img, 25, 25, 25);
// 白色字体颜色
$color = imagecolorallocate($img, 255, 255, 255);
// 字符串的长度
$len = strlen($string);
// 字符的 Y 坐标,X 变化,Y 静态
$ypos = 0;
// 循环遍历字符串
for($i=0;$i<$len;$i++){
// 字符的水平位置
$xpos = $i * imagefontwidth($font_size);
// 绘制字符
imagechar($img, $font_size, $xpos, $ypos, $string, $color);
// 从字符串中删除字符
$string = substr($string, 1);

}
// 返回图像
header("Content-Type: image/gif");
imagegif($img);
// 删除图像
imagedestroy($img);

?>
Epidemiah
16 年前
它只是一个简单的函数,可以在图片中间写入字符串。

<?php

function imageCenterString(&$img, $font, $text, $color)
{
if(
$font < 0 || $font > 5){ $font = 0; }
$num = array(array(4.6, 6),
array(
4.6, 6),
array(
5.6, 12),
array(
6.5, 12),
array(
7.6, 16),
array(
8.5, 16));
$width = ceil(strlen($text) * $num[$font][0]);
$x = imagesx($img) - $width - 8;
$y = Imagesy($img) - ($num[$font][1] + 2);
imagestring($img, $font, $x/2, $y/2, $text, $color);
}

?>
god at in-heaven dot org
17 年前
这是一个用于创建对齐字符串的简单函数,该字符串被裁剪以匹配 $x1 和 $x2 之间的空间。
<?php
function imagestringcutted($img,$font,$y,$x1,$x2,$text,$color,$align="center") {
$fontwidth = imagefontwidth($font);
$fullwidth = strlen($text) * $fontwidth;
$maxwidth = $x2-$x1;
$targetwidth = $fullwidth-(4*$fontwidth);
if(
$fullwidth > $maxwidth) {
for(
$i = 0; $i < strlen($text) AND ((strlen($text)-($i-4))*$fontwidth) > $targetwidth ;$i++) { }
$text = substr($text,0,(strlen($text)-$i)-4)."...";
}
if(
$align == "left") imagestring($img,$font,$x1,$y,$text,$color);
elseif(
$align == "right") imagestring($img,$font,$x2 - ((strlen($text) * $fontwidth)),$y,$text,$color);
else
imagestring($img,$font,($x2-$x1)/ 2 - strlen($text) * $fontwidth / 2,$y,$text,$color);
}
?>
用法
<?php
imagestringcutted
($img,$font,$y,$x1,$x2,$text,$color,$align);
?>
将在 $img 上创建字符串 $text,如果它太长而无法匹配 $x1 和 $2 之间,则会将其裁剪,使用字体 $font 和颜色 $color 在高度 $y 处,并对齐到 $align。
希望它能帮助一些人。
抱歉,我的英语不好。
shadikka at gmail dot com
19 年前
我版本的居中字符串,它会减少字体号(因为我注意到较小的数字是较小的字体),直到字符串不适合为止减少到 1。然后它将放弃。

<?php
function imagestringcentered ($img,$font,$cy,$text,$color) {
while (
strlen($text) * imagefontwidth($font) > imagesx($img)) {
if (
$font > 1) { $font--; }
else { break; }
}
imagestring($img,$font,imagesx($img) / 2 - strlen($text) * imagefontwidth($font) / 2,$cy,$text,$color);
}
?>
bob dot brown at opus dot co dot nz
22 年前
如果您发现您的 imageString 末尾有两个字符看起来像 Y 和倒置的 L,那么它们可能是 CR/LF 的表示。尝试在输出之前使用 trim() 修剪字符串。(我非常确定这是一个错误 <g>)
Abubaker dot shamlan at gmail dot com
15 年前
这是一个基于 imagestring 的函数,它在图像的中心生成文本,希望它能帮到您:D

<?php
function ImageStringCenter($image_resource, $font_size, $line_number, $total_lines, $text, $color ) {

$center_x = ceil( ( imagesx($image_resource) - ( ImageFontWidth($font_size) * strlen($text) ) ) / 2 );

$center_y = ceil( ( ( imagesy($image_resource) - ( ImageFontHeight($font_size) * $total_lines ) ) / 2) + ( ($line_number-1) * ImageFontHeight($font_size) ) );

ImageString($image_resource, $font_size, $center_x, $center_y, $text, $color );

}
?>
tjpoe at cableaz dot com
19 年前
我修改了居中函数,并创建了这个函数,它将每个单词居中在它自己的行上。您可以使用 $valign 变量调整间距。目前,如果文本对于图像太大,则没有实现。字符串按空格分词,但可以明显更改。

function ImageStringWrap($image, $font, $text, $color)
{
$fontwidth = ImageFontWidth($font);
$fontheight = ImageFontHeight($font);
$words= str_word_count($text);
if ($words > 1){
$string=array(strtok($text,' '));
for ($i = 1 ; $i <= $words ; $i++){
$string=array_merge($string,array($i=>strtok(' ')));
}
}
else
$string=$text;
$vspace=4;
$y=((imagesy($image)-($fontheight*$words)-($words*$vspace))/2);
foreach($string as $st){
$x=((imagesx($image)-($fontwidth * strlen($st)))/2);
ImageString($image,$font,$x,$y,$st,$color);
$y+=($fontheight+$vspace);
}
}
希望这有帮助
brooks dot boyd at gmail dot com
19 年前
将字符串作为图像绘制是一种方便的方式来隐藏电子邮件地址,这样垃圾邮件嗅探器就无法轻易获取它。创建包含您的电子邮件的动态图像的唯一问题是,要显示的电子邮件必须通过查询字符串传递,以使静态 HTML 能够使用它。因此,电子邮件必须稍微加密,以防止直接输入您的电子邮件地址。

将以下内容保存为 email.php
<?php
if ($_GET['addr'] != "") {
$msg = $_GET['addr'];
$msg = preg_replace("/\[dot]/",".",$msg);
$msg = preg_replace("/\[at]/","@",$msg);
$final = "";
for (
$i=0; $i<=strlen($msg); $i++) {
$final .= substr($msg, strlen($msg)-$i, 1);
}
$msg = $final;

$char_width = 8;
$char_height = 17;
$padding = 3;
$width = $padding*2+strlen($msg)*$char_width;
$height = +$padding*2+$char_height;
$im = imagecreatetruecolor($width,$height);
imagealphablending($im, FALSE);
imagesavealpha($im, TRUE);
$bg = imagecolorallocatealpha($im, 255, 255, 0, 100);
$text = imagecolorallocatealpha($im, 0, 0, 0, 0);
imagefilledrectangle ($im, 0, 0, $width, $height, $bg); # Make transparent
imagestring($im, 4, $padding, $padding, $msg, $text);
} else {
$im = imagecreatetruecolor(1,1);
imagealphablending($im, FALSE);
imagesavealpha($im, TRUE);
$bg = imagecolorallocatealpha($im, 255, 0, 0, 125);
imagefilledrectangle ($im, 0, 0, 1, 1, $bg); # Make transparent
}
header('Content-type: image/jpg');
imagepng($im);
imagedestroy($im);

?>

如果脚本在没有电子邮件地址的情况下被调用,它将输出一个 2x2 的透明图像。

要调用脚本生成电子邮件 "[email protected]",HTML 标签将是

<img src="email.php?addr=moc[dot]emoh[at]resu">

要对电子邮件地址进行 "加密" 以传递给脚本,请反转地址并将 "." 替换为 "[dot]","@" 替换为 "[at]"。这并不是最牢固的保护,但可以阻止大多数非正式的电子邮件嗅探器。
aholmes84 at hotmail dot com
21 年前
设置字体时,任何小于 1 的整数将默认为 1,任何大于 5 的整数将默认为 5。
rush at 507magazine dot com
18 年前
您好,我注意到,如果使用 rand(3,5),它会将随机的字体大小应用于图像上的每个字符。这在为反垃圾邮件表单验证编写 CAPTCHA 时非常有用。
julien / at / theoconcept.com
18 年前
如果您正在寻找一种为表单验证生成 "CAPTCHA" 图像的方法(以验证它不是机器人),请查看以下内容:http://blog.theoconcept.com/static/distortion/

它使用参数字符串生成一个带有失真的动画图像,以下是一个示例
http://blog.theoconcept.com/static/distortion/distortion.php

(*) 您需要 GD + Freetype 支持
(**) 您需要在机器上安装 ImageMagick
jurgen dot vanoosterwijck at pandora dot be
19 年前
根据前面的示例,以下是如何水平和垂直居中字符串...

<?php
function imagestringcentered ($img,$font,$text,$color) {
while (
strlen($text) * imagefontwidth($font) > imagesx($img)) {
if (
$font > 1) { $font--; }
else { break; }
}
$cy = (imagesy($img)/2) - (imagefontwidth($font)/2);
imagestring($img,$font,imagesx($img) / 2 - strlen($text) * imagefontwidth($font) / 2,$cy,$text,$color);
}
?>
eric dot brison at anakeen dot com
15 年前
与上面的函数相同,但它可以显示多行字符串。
<?php
function sendimagetext($text) {
// 设置字体大小
$font_size = 4;

$ts=explode("\n",$text);
$width=0;
foreach (
$ts as $k=>$string) { // 计算宽度
$width=max($width,strlen($string));
}

// 创建图像宽度取决于字符串的宽度
$width = imagefontwidth($font_size)*$width;
// 将高度设置为字体高度
$height = imagefontheight($font_size)*count($ts);
$el=imagefontheight($font_size);
$em=imagefontwidth($font_size);
// 创建图像调色板
$img = imagecreatetruecolor($width,$height);
// 深红色背景
$bg = imagecolorallocate($img, 0xAA, 0x00, 0x00);
imagefilledrectangle($img, 0, 0,$width ,$height , $bg);
// 白色字体颜色
$color = imagecolorallocate($img, 255, 255, 255);

foreach (
$ts as $k=>$string) {
// 字符串长度
$len = strlen($string);
// 字符的 Y 坐标,X 变化,Y 静态
$ypos = 0;
// 循环遍历字符串
for($i=0;$i<$len;$i++){
// 字符水平位置
$xpos = $i * $em;
$ypos = $k * $el;
// 绘制字符
imagechar($img, $font_size, $xpos, $ypos, $string, $color);
// 从字符串中删除字符
$string = substr($string, 1);
}
}
// 返回图像
header("Content-Type: image/png");
imagepng($img);
// 删除图像
imagedestroy($img);
}
?>
bpgordon at gmail dot com
19 年前
这段代码会生成查询中文本的 png 图像。它会自动调整以适应字符串的长度。
用法:http://yoursite.com/text.php?abcdefg+hijk

使用 + 在图像中生成空格。+ 可以使用插入符号 (^) 作为转义符。大多数其他符号在查询字符串中可以正常使用,例如 ?。

<?php
header
("Content-type: image/png");
$string = $_ENV["QUERY_STRING"];
$md5 = md5($string); // 为了防止将有效文本转换为 +
$string = str_replace("^+", $md5, $string); // 将 ^+ 替换为较长的、不自然的字符串
$string = str_replace("+", " ", $string); // 将 + 替换为空格
$string = str_replace($md5, "+", $string); // 将较长的、不自然的字符串替换为 +
$width = imagefontwidth($font) * strlen($string);
$height = imagefontheight($font);
$image = @imagecreate($width+2, $height+2);
$black = imagecolorallocate($image, 0, 0, 0); // 背景
$white = imagecolorallocate($image, 255, 255, 255);
imagestring($image, 2, 1, 1, $string, $white);
imagepng($image);
imagedestroy($image);
?>
m dot onderwater at esperantoxl dot nl
18 年前
"jurgen dot vanoosterwijck at pandora dot be" 指出,水平和垂直居中函数存在一个小错误。

这行代码

$cy = (imagesy($img)/2) - (imagefontwidth($font)/2);

应该改为

$cy = (imagesy($img)/2) - (imagefontheight($font)/2);
To Top