php图像处理相关总结

2018-08-03  本文已影响0人  宠辱不惊丶岁月静好

一、图像处理概述

1、开启GD2图像扩展库

PHP不仅限于只产生HTML的输出,还可以创建与操作多种不同格式的图像文件。PHP提供了一些内置的图像处理函数,也可以使用GD函数库创建新图像或处理已有的图像。目前GD2库支持JPEG、PNG和WBMP格式。

GD扩展用于动态创建图片,使用C语言编写,开放源代码,现在的版本是2.0,所以称为GD2。

开启GD2扩展库:将php.ini中extension=php_gd2.dll选项前的分号去掉,重启。

查看图像扩展库GD2是否开启,使用函数:phpinfo();

2、创建图像的大致步骤

在PHP中创建一个图像,大致需要四个步骤:

3、画布坐标系说明

画布的坐标系,坐标原点位于画布左上角,以像素为单位,正右方为X轴正方向,正下方为Y轴正方向。

二、创建图像和销毁图像

1、创建基于已有图像的图像

//创建基于已有图像来创建画布
$filename = "./images/01.jpg";
//创建图像,并返回图像资源
$img = imagecreatefromjpeg($filename);
//输出图像到浏览器
header("Content-type:image/jpeg");
imagejpeg($img);
//释放资源
imagedestroy($img);

2、创建空画布图像

//创建一个空画布
$img = imagecreatetruecolor(400, 300);
//输出图像到浏览器
header("Content-type:image/jpeg");
imagejpeg($img);
//释放资源
imagedestroy($img);

3、销毁图像资源

//创建一个空画布
$img = imagecreatetruecolor(400, 300);
//释放资源
imagedestroy($img);
//验证图像资源是否还存在
var_dump($img);

三、图像操作

1、为图像分配颜色

//创建一个空画布
$img = imagecreatetruecolor(400, 300);
//分配颜色
$bgcolor = imagecolorallocate($img, 0xFF, 0xFF, 0x00);
//给画布填充颜色
imagefill($img, 0, 0, $bgcolor);
//输出图像到浏览器
header("Content-type:image/jpeg");
imagejpeg($img);
//释放资源
imagedestroy($img);

2、输出图像到浏览器或保存文件

//从已知图像上创建画布
$img = imagecreatefromjpeg("./images/01.jpg");
//将图像另存为文件,并不需要声明header()函数
//如果输出jpeg图像,必须要指定第3个质量参数
//imagepng()和imagegif()没有第3个参数
imagejpeg($img, './images/02.jpg', 100);
//释放资源
imagedestroy($img);

3、水平地画一行字符串

//创建一个空画布
$img = imagecreatetruecolor(200, 50);
//分配颜色
$bgcolor = imagecolorallocate($img, 200, 200, 200);
$fgcolor = imagecolorallocate($img, 0xFF, 0x00, 0x00);
//给画布填充背景色
imagefill($img, 0, 0 ,$bgcolor);
//往图像上写一行普通字符串
$str1 = "Welcome to Beijing!";
$str2 = "Welcome to Beijing!";
$font = 5;
imagestring($img, $font, 25, 5, $str1, $fgcolor);
imagestring($img, $font, 25, 25, $str2, $fgcolor);
//输出并图像并销毁图像
header("Content-type:image/png");
imagepng($img);
imagedestroy($img);

4、获取画布的宽度和高度

5、获取内置字体的宽度和高度

6、实例:在图像上绘制一行居中的字符串

应该知道的知识:

  • 图片在画布居中
  • 先计算画布起点坐标
  • 图像x轴坐标:(画布宽 - 图像宽) / 2
  • 图像y轴坐标:(画布高 - 图像高) / 2
//1、从已知图像上创建画布
$img = imagecreatefromjpeg('./images/img02.jpg');
//2、分配颜色
$fontcolor = imagecolorallocate($img, 0xFF, 0x00, 0x00);
//3、计算字符串的起始坐标
$fontsize = 5;
$str = "Welcome";
$imgWidth = imagesx($img);
$imgHeight = imagesy($img);
$fontWidth = imagefontwidth($fontsize);
$fontHeight = imagefontheight($fontsize);
$x = ($imgWidth - $fontWidth * strlen($str)) / 2;
$y = ($imgHeight - $fontHeight) / 2;
//4、往画布上写入一行字符串
imagestring($img, $fontsize, $x, $y, $str, $fontcolor);
//输出图像,并销毁图像资源
header("Content-type:image/png");
imagepng($img);
imagedestroy($img);

7、画一个矩形并填充

8、画一个单一像素

//创建一个空画布
$img = imagecreatetruecolor(400, 300);
//分配颜色
$bgcolor = imagecolorallocate($img, 0xCC, 0xCC, 0xCC);
//绘制矩形并填充颜色
imagefilledrectangle($img, 0, 0, 400, 300, $bgcolor);
//绘制随机像素点
for($i = 0; $i <= 1000; $i++)
{
    $pixcolor = imagecolorallocate($img, mt_rand(0, 255), mt_rand(0, 100), mt_rand(0, 100));
    imagesetpixel($img, mt_rand(0, 400), mt_rand(0, 300), $pixcolor);
}
//输出图像,并销毁图像资源
header("Content-type:image/png");
imagepng($img);
imagedestroy($img);

四、实例:图像验证码

1、绘制图像验证码

//1、随机的四位字符串验证码
//2、把随机字符串写入图片

//一.产生4位随机字符串
//a.产生一个随机字符串数组
$arr = array_merge( range('a', 'z'), range(0, 9), range('A', 'Z') );
//b.打乱数组的顺序(打乱两次)
shuffle($arr);
shuffle($arr);
//c.从原数组中随机取四个下标
$arr2 = array_rand($arr, 4);
//d.根据随机的下标取出对应数组元素的值
$str = '';
foreach($arr2 as $index)
{
  $str .= $arr[$index];
}

//二.将四位随机字符串写入图片
//a.创建一个空画布
$img = imagecreatefromjpeg('./images/captcha_bg2.jpg');
//b.分配颜色
$fontcolor = imagecolorallocate($img, mt_rand(200, 255),  mt_rand(200, 255), mt_rand(200, 255));
//c.计算字符串的起始坐标
$imgWidth = imagesx($img);
$imgHeight = imagesy($img);
$fontsize = 5;
$fontWidth = imagefontwidth($fontsize);
$fontHeight = imagefontheight($fontsize);
$x = ($imgWidth - $fontWidth * strlen($str)) / 2;
$y = ($imgHeight - $fontHeight) / 2;
//d.往图片上写一行字符串
imagestring($img, $fontsize, $x, $y, $str, $fontcolor);
//输出图像并销毁图像
header('content-type:image/png');
imagepng($img);
imagedestroy($img);

2、产生一个指定范围的数组

3、合并数组

4、从数组中随机取出一个或多个单元

5、生成更好的随机数

五、实例:往图像上写入一行汉字

//网图像上写入一行TTF文本,该文本可以调大小,改字体
//1、创建一个空画布
$img = imagecreatetruecolor(400, 200);
//2、分配颜色
$bgcolor = imagecolorallocate($img, 200, 200, 200);
$fgcolor = imagecolorallocate($img, 255, 0, 0);
//3、给画布填充背景色
imagefill($img, 0, 0, $bgcolor);
//4、写入文本的参数
$fontsize = 24;
$fontfile = './images/msyh.ttf';
$str1 = 'HelloWorld';
$str2 = '北京欢迎您';

//5、往图像上写入TTF字符串
imagettftext($img, $fontsize, 0, 50, 100, $fgcolor, $fontfile, $str1);
imagettftext($img, 18, 0, 150, 150, $fgcolor, $fontfile, $str2);
//6、输出图像,并销毁图像
header('content-type:image/png');
imagepng($img);
imagedestroy($img);

六、实例:制作图像水印效果

//1、从已知图像上创建画布
$img = imagecreatefromjpeg('./images/01.jpg');
//2、分配半透明的颜色
$fontcolor = imagecolorallocatealpha($img, 0xdd, 0xdd, 0xdd, 100);
//3、往图像上写一行TTF字符串
$fontsize = 24;
$fontfile = './images/msyhbd.ttf';
$str = '北京欢迎您';
imagettftext($img, $fontsize, 15, 45, 300, $fontcolor, $fontfile, $str);
//4、输出图像
header('content-type:image/png');
imagepng($img);
imagedestroy($img);

七、实例:生成图像缩略图

//1、创建基于原图的画布
$src_img = imagecreatefromjpeg('./images/03.jpg');
$src_w = imagesx($src_img);
$src_h = imagesy($src_img);
//2、创建目标画布,画布的尺寸是原图的一半
$dst_w = $src_w * 0.3;
$dst_h = $src_h * 0.3;
$dst_img = imagecreatetruecolor($dst_w, $dst_h);
//3、复制原图并调整大小
imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $dst_w, $dst_h, $src_w, $src_h);
//4、保存缩略图文件
imagejpeg($dst_img, './images/s_03.jpg', 100);
//5、释放资源
imagedestroy($src_img);
imagedestroy($dst_img);
上一篇下一篇

猜你喜欢

热点阅读