PHP 日本会议 2024

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 编码的内置字体(较大的数字对应较大的字体),或者是由 imageloadfont() 返回的 GdFont 实例。

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()

参见

添加笔记

用户贡献笔记 30 条笔记

keksnicoh at googlemail dot com
16 年前
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
15年前
这里有一小段代码,当我只能使用 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
18 年前
内置字体过去使用 latin-2 (iso8859-2) 编码。一段时间以来,它们使用 latin-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;
}
?>
[email protected]
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);
}
[email protected]
20年前
//简单的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);
?>
[email protected]
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);
?>
[email protected]
17 年前
我稍微修改了一下(非常有用的)imagestringcutted 函数(当 align=center 时,如果 x1!=0,它对我来说效果不好),所以只需将最后一行替换为

<?php
[...]
else
imagestring($img,$font,$x1+($x2-$x1)/ 2 - strlen($text) * $fontwidth / 2,$y,$text,$color);
}
?>
[email protected]
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 );
}
[email protected]
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)
[email protected]
15年前
我创建了一个替代方案,使用 imagechar 函数创建一个图像字符串。下面的函数用于创建一个与文本字符串高度和宽度相同的图像。它在我的网站上用于屏蔽用户的电子邮件地址。

<?PHP

// 设置您的字符串
$string = '[email protected]';

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

// 创建依赖于字符串宽度的图像宽度
$width = imagefontwidth($font_size)*strlen($string);
// 将高度设置为字体高度
$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[$i], $color);
}
// 返回图像
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);
}

?>
[email protected]
18 年前
这是一个创建对齐字符串的简单函数,该字符串会被裁剪以匹配 $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 上,使用字体 $font 和颜色 $color,在高度 $y 处绘制字符串 $text。如果字符串过长,超过 $x1 和 $x2 之间的范围,则会截断字符串。
希望这对某些人有所帮助。
抱歉我的英语不好。
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 的字符,它们可能是回车符/换行符的表示。尝试在输出字符串之前使用 trim() 函数去除多余的空格。(我曾经非常肯定这是一个bug <g>)
Abubaker dot shamlan at gmail dot com
16 年前
这是一个基于 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
20年前
将字符串绘制成图像是一种方便的方法,可以伪装电子邮件地址,使垃圾邮件嗅探器难以轻易获取。创建包含电子邮件的动态图像的唯一问题是,要显示的电子邮件必须通过查询字符串传递,以便静态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); # 创建透明背景
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); # 创建透明背景
}
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]"。这并不是最牢不可破的保护措施,但它可以阻止大多数 casual 的电子邮件嗅探器。
aholmes84 at hotmail dot com
22 年前
设置字体时,任何小于 1 的整数都默认为 1,任何大于 5 的整数都默认为 5。
rush at 507magazine dot com
18 年前
你好,我注意到如果你使用 rand(3,5),它会为图像上的每个字符设置随机大小的字体。这在为反垃圾邮件表单验证编程验证码时非常有用。
julien / at / theoconcept.com
18 年前
如果您正在寻找一种为表单验证生成“验证码”图像(以验证它不是机器人)的方法,请查看此处: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);
?>
To Top