PHP学习之GD库图像处理

配置

<?php
header("content-type:text/html;charset=utf-8");
/**
 * GD库提供图像处理功能
 * GD库的配置
 * 1.配置php.ini,开启extension=gd2/php_gd2.dll,两种书写风格都可识别
 * 2.开启extension_dir="ext",这一步是指定扩展目录
 * 3.重启服务器
 * 
 * 检测GD扩展是否已开启
 * 1.phpinfo();
 * 2.extension_loaded('gd')
 * 3.function_exists('gd_info')
 * 4.gd_info()
 * 5.get_defined_functions()
 */
//检测扩展是否已开启
var_dump(extension_loaded('gd'));//bool(true)

//检测函数是否可以使用
var_dump(function_exists('gd_info'));//bool(true)

//得到gd库信息
var_dump(gd_info());

//得到所有已定义的函数,在其中找gd相关函数
print_r(get_defined_functions());

绘图基本步骤

<?php
//1.创建画布:imagecreatetruecolor($width, $height)
$image = imagecreatetruecolor(500, 300);

//2.创建颜色:imagecolorallocate($image, $red, $green, $blue)
$red = imagecolorallocate($image, 255, 0, 0);
$blue = imagecolorallocate($image, 0, 0, 255);

//3.绘画:imagechar()水平绘制一个字符;imagecharup()垂直绘制一个字符;imagestring()水平绘制字符串
//imagechar($image, $font, $x, $y, $char, $color),其他函数同理
imagechar($image, 5, 30, 50, 'H', $red);
imagestring($image, 18, 100, 120, 'still', $blue);//18不生效,字号最大到5

//4.输出
//4.1告诉浏览器以图片的形式显示:加一个header(),image/jpeg、image/gif、image/png
header("content-type:image/png");
//4.2输出图像:imagejpeg($image);或imagepng()、imagegif()
imagepng($image);//输出到浏览器
imagepng($image, 'images/demo.png');//保存文件

//5.销毁图像
imagedestroy($image);

美化图像

/**
 * 1.画布默认黑色,修改为白色
 * 2.字体自定义
 */
//创建随机颜色
$randColor = imagecolorallocate($image, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255));

//imagefilledrectangle()绘制填充矩形
imagefilledrectangle($image, 0, 0, 500, 500, $white);

//imagettftext($image,$size,$angle,$x,$y,$color, $fontfile, $text)用TrueType字体向图像写入文本
//$x和$y定义字符的左下角,$y是基线位置
//在测试中发现fontfile写绝对路径才会生效
imagettftext($image, 28, 30, 50, 280, $randColor, 'C:\study\gd\fonts\consola.ttf', 'This is a show');
imagettftext($image, 22, 0, 300, 120, $randColor, 'C:\website-study\gd\PALSCRI.TTF', 'HanyStill');

验证码绘制案例

生成验证码【字符串函数】
/**
 * range(0,9)生成包含0-9的数组
 * array_rand(array, num)从数组中取出多个随机单元的key值
 * implode([glue],array) [用glue]将一维数组的值连接为字符串,别名join
 * array_merge(array...)合并一个或多个数组
 * array_flip(array) 交换数组中的key和value
 * explode(delimiter,string) 用delimiter分割string,返回数组
 */
switch ($type) {
    //type取值 1.数字 2.字母 3.数字+字母 4.汉字
    case 1:
        $code = implode(array_rand(range(0, 9), $length));
        break;
    case 2:
    	$arr = array_flip(array_merge(range('a', 'z'), range('A', 'Z'));//键值为a-Z的数组
        $code = implode(array_rand($arr, $length));
        break;
    case 3:
    	$arr = array_flip(array_merge(range(0, 9), range('a', 'z'), range('A', 'Z'));
        $code = implode(array_rand($arr, $length));
        break;
    case 4:
        $str = "在,中,国,共,产,党,的,领,导,下,人,民,生,活,会,更,加,美,好,因,为,力,量,拧,成,一,股,绳,
        困,难,和,险,阻,也,击,垮,不,了,我,们,最,后,衷,心,祝,愿,祖,国,繁,荣,昌,盛";
        $code = implode(array_rand(array_flip(explode(',', $str)), $length));
        break;
    default:
    	//exit()输出一个消息并退出当前脚本
        exit('非法参数');
        break;
}
绘制验证码
//imagefontwidth(size)|imagefontheight(size) 得到字体的宽高(字体最大为28),用于计算$x,$y
$textwidth = imagefontwidth(28);//9
$textheight = imagefontheight(28);//15
for($i=0; $i<$length; $i++){
   //$length 验证码长度
    $size = mt_rand(20,28);
    $angle = mt_rand(-15, 15);
    $x = 15+45*$i+mt_rand(0,36);//计算得到宽度范围
    $y = $textheight/1.5;
	//mb_substr($string, $start, $length, $encoding) 获取多字节字符串的部分
    $text = mb_substr($string, $i, 1, 'utf-8');
    imagettftext($image, $size, $angle, $x, $y, getRandColor($image), $fontFile, $text);
}
给验证码添加干扰元素
//添加像素当作干扰元素:imagesetpixel($image, $x, $y, $color)
for($i=0; $i<50; $i++){
   
    imagesetpixel($image, mt_rand(0,$width), mt_rand(0,$height), getRandColor($image))
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值