使用PHP创建图像和图形的操作



PHP编程语言可用来编写许多网页,例如WordPress和本网站的大部分内容,还可用于绘制图像 ,为此,本文介绍 php创建图像的几种基本方法,而且这些图像在实践中有许多用途,如:制作验证码图像,创建动态文本图像,防机器人验证图像等等。 

首先我们要用到GD库, 使用GD函数库创建新图像或处理已有的图像,GD库PHP默认是开启的,如果没有开启则需要在php.ini 把extension=php_gd2.dll前面的;分号去掉,然后重启apache。

PHP提供了一些功能来创建图像并配置图像的显示方式,用到的GD库函数:

  • imagecreate 创建基于调色板的新图像
  • imagecreatetruecolor 创建新的真彩色图像
  • imageline 绘制线
  • imagestring 水平绘制文本字符串
  • imagecolorallocate 图像匹配颜色
  • imagefill 图形这色填充
  • imagepng 建立PNG图像打印到浏览器
  • imagefttext 字体将文本写入图像
  • imagedestroy 使销毁图像 结束图形

使用PHP创建带有电子邮件地址的图像

在第一个示例中,我们演示如何创建仅显示一行文本的图像,例如,在本例中为电子邮件地址。

<?php
header("Content-Type: image/png");
$img = @imagecreate(150, 25);
$color_fondo = imagecolorallocate($img, 0, 153, 255);
$color_t = imagecolorallocate($img, 255, 255, 253);
imagestring($img, 10, 5, 5, "xxx@gmail.com", $color_t);
imagepng($img);
imagedestroy($img);
?>

效果演示:



可以修改的参数如下: @imagecreate(150,25)图像的宽度和高度,$color_fondo以其三个RGB值表示的背景色,$ color_t以其三个RGB值表示的文本色,imagestring()3个值,文本内容和文本属性。可以从图像编辑器程序获得颜色的RGB值。

在PHP中创建图像显示IP地址

显示了用于访问此页面访客的IP地址,获取IP使用$ _SERVER [REMOTE_ADDR] 。

代码:

<?php
$img_number = imagecreate(250,28);
$backcolor = imagecolorallocate($img_number,0,153,253);
$textcolor = imagecolorallocate($img_number,255,255,255);
imagefill($img_number,0,0,$backcolor);
$number = " Your IP: $_SERVER[REMOTE_ADDR]";
Imagestring($img_number,10,5,5,$number,$textcolor);
header("Content-type: image/jpeg");
imagejpeg($img_number);
?>

效果演示:



使用PHP创建字体图像

上面的图像具有字体大小受限制的限制。为了创建具有不同文本样式的图像,除了可以缩放字体和相同图像的大小外,还可以使用我们喜欢的自定义字体并在代码中指示其路径。我们使用“ imagecreatetruecolor()”以确保图像质量。

代码:

<?php
ob_clean();
// 创建一个500x300的图片
$img = imagecreatetruecolor(500, 300);
//背景和文字颜色
$rojo = imagecolorallocate($img, 201, 101, 115);
$crema = imagecolorallocate($img, 250, 250, 219);
imagefilledrectangle($img, 0, 0, 500, 299, $crema);
// 你的字体文件路径
$fuente = realpath('./fonts/iconfont.ttf');
// 文字框
$bbox = imagettfbbox(50, 0, $fuente, '字体演示' );
// X和Y的坐标
$x = $bbox[0] + (imagesx($img) / 2) - ($bbox[4] / 2) - 25;
$y = $bbox[1] + (imagesy($img) / 2) - ($bbox[5] / 2) - 5;
// 写出来
imagettftext($img, 50, 0, $x, $y, $rojo, $fuente, '字体演示');
// 打印到浏览器
header('Content-Type: image/png');
imagepng($img);
imagedestroy($img);
?>

效果演示:



字体加阴影图像

给字体加个阴影,让其显示的更有立体感 。

代码:

<?php
// 设置内容类型
header('Content-Type: image/png');
// 建立影像
$img = imagecreatetruecolor(500, 100);
// 创建颜色
$blanco = imagecolorallocate($img, 255, 255, 255);
$gris = imagecolorallocate($img, 170, 170, 170);
$rojo = imagecolorallocate($img, 201, 101, 115);
imagefilledrectangle($img, 0, 0, 499, 99, $blanco);
// 绘制文字
$texto = 'Hello world';
// 下面换成你自己的ttf字体路径
$fuente = realpath('./fonts/iconfont.ttf');
// 在文字上添加阴影
imagettftext($img, 50, 0, 43, 63, $gris, $fuente, $texto);
// 新增文字
imagettftext($img, 50, 0, 40, 60, $rojo, $fuente, $texto);
// 与imagejpeg()相比,使用imagepng()将产生更清晰的文本
imagepng($img);
imagedestroy($img);
?>

效果演示:



创建随机字符显示图像

使用PHP创建显示随机字符的图像,创建的图像与之前的图像类似,但是包含一个随机生成6个字符(字母和数字)组合的功能。这也是如何创建两个具有不同样式的文本块的示例。

代码:

<?php
$string="";
$str="";
// 创建一个500x300的图片
$img = imagecreatetruecolor(500, 240);
$rojo = imagecolorallocate($img, 201, 101, 115);
$crema = imagecolorallocate($img, 250, 250, 219);
$negro = imagecolorallocate($img, 80, 80, 80);
imagefilledrectangle($img, 0, 0, 499, 239, $crema);
// 字体文件的路径
$fuente = realpath('./fonts/iconfont.ttf');
$string = "abcdefghijklmnopqrstuvwxyz0123456789";
for($i=0;$i<4;$i++){
    $pos = rand(0,35);
    $str .= $string{$pos};
}
// 写出来
imagettftext($img, 22, 0, 50, 40, $negro, $fuente, '用PHP编写的随机字母和数字');
imagettftext($img, 100, 0, 100, 180, $rojo, $fuente, $str);
// 打印到浏览器
header('Content-Type: image/png');
imagepng($img);
imagedestroy($img);
?>

效果演示:



随机数的创建验证码图像

用不同的Internet服务形式显示的所有图像,以验证用户是人而不是机器或机器人,都是使用PHP创建的,从表单所在页面加载此图像时,会启动session_start()函数;它生成不同的组合。如下所示。

代码:

<?php
header("Content-type: image/png");
$img = @imagecreate(110, 32);
$color_fondo = imagecolorallocate($img, 102,102,153);
$color_texto = imagecolorallocate($img, 255,255,255);
session_start();
  $digit = '';
  for($x = 15; $x <= 95; $x += 20) {
    $digit .= ($num = rand(0, 9));
    imagechar($img, rand(3, 5), $x, rand(2, 14), $num, $color_texto);}  
imagepng($img);
imagedestroy($img);
$_SESSION['img_number'] = $digit;
?>

效果演示:



带有线条和配色方案的验证码的图像

下图实现了与上一图相同的功能,但是线条和颜色纹理使机器人更难以破解。

代码:

<?PHP
   $image = @imagecreatetruecolor(120, 30) or die("Cannot Initialize new GD image stream");
  // 设置背景并分配图纸颜色
  $background = imagecolorallocate($image, 0x66, 0x99, 0x66);
  imagefill($image, 0, 0, $background);
  $linecolor = imagecolorallocate($image, 0x99, 0xCC, 0x99);
  $textcolor1 = imagecolorallocate($image, 0x00, 0x00, 0x00);
  $textcolor2 = imagecolorallocate($image, 0xFF, 0xFF, 0xFF);
  // 在画布上画随机线
  for($i=0; $i < 6; $i++) {
    imagesetthickness($image, rand(1,3));
    imageline($image, 0, rand(0,30), 120, rand(0,30) , $linecolor);
  }
  session_start();
  // 使用随机的黑色/白色为画布添加随机数字
  $digit = '';
  for($x = 15; $x <= 95; $x += 20) {
    $textcolor = (rand() % 2) ? $textcolor1 : $textcolor2;
    $digit .= ($num = rand(0, 9));
    imagechar($image, rand(3, 5), $x, rand(2, 14), $num, $textcolor);
  }
  // 在会话变量中记录数字
  $_SESSION['digit'] = $digit;
  // 显示图像并清理
  header('Content-type: image/png');
  imagepng($image);
  imagedestroy($image);
?>

效果演示:



给图片加水印

有些时候我们需要给自己制作的图片不想随便被人使用,这时我们需要给图片加水印。

代码:

<?php
$img = ImageCreate(400,60);   //创建一个宽400 高60的图片
//需要添加水印图片路径
$img = ImageCreateFromJpeg('./t.jpg');
$black = imagecolorallocate($img, 100, 116, 163); //创建颜色
$red = imagecolorallocate($img,255,0,0);
$white = imagecolorallocate($img,255,255,255);
imagerectangle($img, 10, 10, 30, 30, $white);
imagefilledrectangle($img, 20, 20, 40, 40, $white);
$font = realpath('./fonts/iconfont.ttf');
//填写水印文字
imagettftext($img, 30, 0, 250, 260, $white, $font, 'YUDAY分享网');
header('Content-type:image/png');
ImagePng($img);
ImageDestroy($img);
?>

效果演示: