时间与日期,图像处理(目前仅做到验证码,明天做水印和缩放裁剪的那部分课)

为了方便学习,提供一个在线PHP网址

时间与日期

设置时区

默认时区:UTC

date_default_timezone_set('Asia/Shanghai');

获取当前Unix时间戳

Unix时间戳从Unix纪元(1970.01.01,00:00:00)开始到当前的秒数。

time();

获取指定时间的Unix时间戳

将时分秒月日年转换为Uinx秒数。

mktime(时,分,秒,月,日,年,废弃参数(忽略此参数));
mktime(12,30,43,1,30,2023);
获取差距时间:(也就是获取未来和当下相距多少秒)
$Distance = mktime(未来的时分秒月日年)-time()
当然,获取相差多少天可以这样算
$Distance/60/60/24
获取min/h/day/month/year(换算)

从Unix时间戳取得时间日期信息

将Unix秒数转换为时分秒月日年。(格式化一个时间)


date(string $format[,time]);
第一个参数:时间的格式(必选)
第二个参数:时间戳(默认是当前时间)

// 打印当前的年月日时分秒
echo date('Y-m-d h:i:s');
// 2023-02-26 03:03:55

具体时间字符串参数参照如下:

time
time
time

获取Unix时间戳和微秒数

microtime();

var_dump(microtime(true));
// 返回:double(1677395662.4694)

拓展一个控制浮点数小数点四舍五入的函数
round(浮点数, 整数);
// 整数控制浮点数小数位数。

图像处理(GD库)

具体涉及GD扩展库,用来处理图像。

注意:GD库的函数有很多,这里仅仅使用一小部分。

// 一 绘制图像
// 创建图像


// 1.新建色彩图像
// 俩参数,x轴和y轴的。
var_dump(imagecreatetruecolor(100, 100));
// 返回一个资源类型的:resource(2) of type (gd)

// 2.打开服务器或者网络文件已经存在的GIF,JPEG,PNG,WBMP格式图像
imagecreatefromjpeg()
imagecreatefrompng()
imagecreatefromgif()
imagecreatefromwbmp()
创建或者打开失败的时候会返回空字符串,并且输出一条错误信息
imagesx() //输出画布宽度
imagesy() //输出画布高度
getimagesize() //取得图像大小



// 二 绘制图像
// 图像创建完成以后,就可以通过这个图像资源,使用各种画像函数设置图像的颜色、填充图像、画点、线段、以及向图像的添加文本等

1.imagecolorallocate() //分配颜色 ==> 括号参数:(资源变量)需要处理的图像变量,rgb的三个整数,例如imagecolorallocate($img,122,231,11);
2.imagefill() //区域填充 ==> 参数:资源变量,xy坐标,需要填充的颜色 ==> 从左上角开始填充
3.imagesetpixel() //画一个单一像素($img,$x,$y,$color)
4.imageline() //画一条线段($img, $x1,$y1,$x2,$y2,$color)
5.imagerectangle() //画一个矩形($img, $x1,$y1,$x2,$y2,$color)
6.imagestring() //水平地画一行字符串($img, $font,$x,$y,$string,$color)其中,$font是内置字体的意思,有1~5共计5个整数.

// 验证码+文字水印,都用得到这个。
7.imagettftext() //用 TrueType 字体向图像写入文本(更常用)($img, $size,$angle,$x,$y,$color,$fontfile,$text)
// $size(字体大小)
// $angle(倾斜度,逆时针)
// $x,$y(左下角)
// $color
// $fontfile 字体文件所在路径,ttf文件
// $text(你的字符串)

8.imagettfbbox() //计算 TrueType 文字所占区域
9.imagecopy() //拷贝图像的一部分
// 默认左上角开始
// $img,src_im,$img_x,$img_y,$src_x,$src_y,$src_w,$src_h
// $img,src_im:资源变量
// 将src_im图像中坐标$src_x,$src_y开始,宽度$src_w,高度$src_h的一部分拷贝到$img的$img_x和$img_y上。

10.imagecopymerge() //拷贝并合并图像的一部分
// 和上面的图像拷贝相比,它的末尾多了一个参数:透明度
// $img,src_im,$img_x,$img_y,$src_x,$src_y,$src_w,$src_h,$pct
// $pct:透明度,范围是 0 到 100,越小越透明

// 裁剪+缩放
11.imagecopyresampled() //重采样拷贝部分图像并调整大小
// 采集图像资源到另外一个图像上去(和上面的水印基本上差不多,参数几乎一致)
// dst_im,src_im,dst_x,dst_y,src_x,src_y,dst_w,dst_h,src_w,src_h
// • dst_im:目标图像资源(接受截图)
// • src_im:源图像资源(开始截图)
// • dst_x:目标图像左上角的 x 坐标
// • dst_y:目标图像左上角的 y 坐标
// • src_x:源图像左上角的 x 坐标
// • src_y:源图像左上角的 y 坐标
// • dst_w:目标图像的宽度
// • dst_h:目标图像的高度
// • src_w:源图像的宽度
// • src_h:源图像的高度



// 三 生成图像
// 输出函数
header() // 函数前面不能有任何东西输出
// 可以设置文件编码
// 可以设置文件的头类型

imagejpeg() // 格式($资源变量,'文件存储的路径'),
// 不带上文件路径时,可以配合head在浏览器生成一张图片。并且将php文件当中图片来引用。
// 带上文件路径,相当与直接生成一张图片到对应的文件夹当中,浏览器就没有输出。php文件也就依然还是原来的php文件。
// 路径最好使用相对路径,它会使用到整个文件系统的目录,类似于下面:
// 以world.jpeg文件名保存到特定目录下
imagejpeg($img, "C:/Users/11111/Desktop/music/world.jpeg");
// 当然,函数成功的时候,会返回true

imagegif()
imagepng()
imagewbmp()


四 释放资源
1.销毁图像
imagedestroy(资源变量);

下面做一个正常展示图片的示范

<?php
header("Content-type:image/jpeg");
imagecreatetruecolor(1000, 1000);
$img = imagecreatetruecolor(100, 100);
$color1 = imagecolorallocate($img, 255, 0, 0);
$color2 = imagecolorallocate($img, 110, 255, 33);
imagefill($img, 0, 0, $color1);
imagejpeg($img);
// 浏览器会显示一张红色的图片
?>

当php文件只有上面的代码时,php可以作为html的图片链接引用。

<img src='the_photo.php'>

设计验证码

参考字体

// 五 设计验证码
// rand($a,$b) // 生成随机数,从[$a,$b]
// 字体调用部分其实可以不使用数组的,如果因为字体的属性不一样,产生随机数的效果出现了严重偏差,甚至是没有字符出现,个人认为,这是得不偿失的。


header('Content-type:image/jpeg');
$witch = 120;
$height = 40;
// 放置随机字符串
$element = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');
$str_all = "";
// 获取随机字符组合,共计4位
for ($i = 0; $i < 4; $i++) {
$str_all .= $element[rand(0, count($element) - 1)];
}

// 放置随机验证码的字体模块,并且随机获取其中的一个文件路径
$fontarray = array('Good-Hood/GoodHood-2.otf', 'Gap/Gap-Regular-3.ttf', 'Maria/Maria-Regular-2.otf');
$fontfile = "Study/D01/Captcha_module/font/" . $fontarray[rand(0, count($fontarray))];

// 生成资源类型的变量
$img = imagecreatetruecolor($witch, $height);
// 生成颜色
$color3 = imagecolorallocate($img, rand(100, 255), rand(200, 255), rand(200, 255));
// 调用一个颜色作为背景色
imagefill($img, 0, 0, $color3);

$color5 = imagecolorallocate($img, rand(100, 189), rand(100, 200), rand(100, 190));
for ($i = 0; $i < 100; $i++) {
// 生成随机像素点,共计100个
imagesetpixel($img, rand(1, $witch - 3), rand(1, $height - 3), $color5);
}
for ($i = 0; $i < 5; $i++) {
// 画横线,共计5条
imageline($img, rand(0, $witch / 2), rand(0, $height / 2), rand($witc / 2, $witch), rand($height / 2, $height), $color5);
}

// 文本颜色
$color6 = imagecolorallocate($img, rand(10, 100), rand(10, 100), rand(10, 100));

// 更丰富的文本,调用了字体
imagettftext($img, 15, rand(-5, 5), rand(5, 60), rand(15, 35), $color6, $fontfile, $str_all);
imagejpeg($img);
imagedestroy($img);