国强极客
有问题请加微信:guoqiang7585
国强极客

4、php图像处理 创建销毁 画图 验证码 水印 缩略图

4、php图像处理 创建销毁 画图 验证码 水印 缩略图

1、开启GD2图像扩展库

PHP不仅限于只产生HTML的输出,还可以创建与操作多种不同格式的图像文件。PHP提供了一些内置的图像处理函数,也可以使用GD函数库创建新图像或处理已有的图像。目前GD2库支持JPEG、PNG和WBMP格式。
GD扩展用于动态创建图片,使用C语言编写,开放源代码,现在的版本是2.0,所以称为GD2。
开启GD2扩展库:将php.ini中extension=php_gd2.dll选项前的分号去掉,重启。

2、查看图像扩展库GD2是否开启

3、创建图像的大致步骤

在PHP中创建一个图像,大致需要四个步骤:
(1)创建画布:创建一个画布,以后的操作都基于此画布操作;
(2)绘制图形:在画布上绘制图像轮廓或输入文本;
(3)输出图像:也可以另存为;
(4)释放资源:释放图像占用的内存资源。

4、画布坐标系说明

下图说明了画布的坐标系。坐标原点位于画布左上角,以像素为单位。

创建图像和销毁图像

1、创建基于已有图像的图像imagecreatefromjpeg()

描述:由文件或 URL 创建一个新图象。
语法:

resource imagecreatefrompng ( string $filename )

参数:$filename为图像的完整路径。
返回:成功后返回图象资源,失败后返回 FALSE 。
提示:imagecreatefromjpeg() / imagecreatefromgif() / imagecreatefrompng()语法与该函数一样,根据已有图片类型,选择使用函数。

2、创建空画布图像imagecreatetruecolor()

描述:新建一个真彩色图像,支持24位色,即RGB(256,256,256)。
语法:

resource imagecreatetruecolor ( int $width , int $height )

参数:\(width图像宽度;\)height图像高度;
返回:成功后返回图象资源,失败后返回 FALSE 。

3、销毁图像资源imagedestroy()

描述:销毁一图像。释放与 image图像标识符关联的内存。
语法:

bool imagedestroy ( resource $image )

参数:$image为由imagecreatetruecolor()创建的图像标识符。

图像操作

1、为图像分配颜色imagecolorallocate()

语法:

int imagecolorallocate(resource $image,int $red,int $green,int $blue)

参数:$image图像资源标识符;
提示:第一次对 imagecolorallocate()的调用会给图像填充背景色。

1.1、imagefill()给图片画布填充颜色

语法:

bool imagefill ( resource $image , int $x , int $y , int $color )

imagefill() 在 image 图像的坐标 x,y(图像左上角为 0, 0)处用 color 颜色执行区域填充(即与 x, y 点颜色相同且相邻的点都会被填充)。

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

描述:以 JPG/GIF/PNG 格式将图像输出到浏览器或文件
语法:

bool imagejpeg ( resource $image [, string $filename [, int $quality ]] )

参数:

$filename,将创建的图像保存到文件;如果省略,则直接在浏览器输出。
如果要省略这个参数而提供 quality 参数,使用NULL。
quality 为可选项,范围从 0(最差质量,文件更小)到 100(最佳质量,文件最大)。默认的质量值(大约 75)。

提示:imagegif()、imagepng(),与imagejpeg()格式一样,但没有第3个参数。

3、水平地画一行字符串imagestring()

描述:水平地画一行字符串
语法:

bool imagestring(resource $img, int $font, int $x, int $y, string $s, int $col)

参数:

\(img 图像资源;
\)font字体大小,取值1、2、3、4、5,使用内置字体;
\(x , \)y 绘制字符串的开始坐标,一般在显示在画布左上角;
\(s 代表要绘制的一行字符串;
\)col 代表文本颜色。
\(s,代表一行字符串;\)col,代表文本颜色;

//创建一个空画布
$img = imagecreatetruecolor(300,100);
//分配颜色
$color1 = imagecolorallocate($img,0,0,0); //背景黑色
$color2 = imagecolorallocate($img,255,0,0); //文字红色
//填充背景色
imagefill($img,0,0,$color1);
//往图像上写入一行字符串(非中文)
//imagestring(图像资源,字号大小,X坐标,Y坐标,字符串,文字颜色)
$str = "Welcome to Itcast!";
imagestring($img,5,40,20,$str,$color2);
imagestring($img,5,60,50,$str,$color2);
imagestring($img,5,80,80,$str,$color2);
//输出图像到浏览器
header("Content-Type:image/png");
imagepng($img);
//销毁图像资源
imagedestroy($img);

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

宽度:

int imagesx ( resource $image )

高度:

int imagesy ( resource $image )

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

描述:返回指定字体一个字符宽度或高度的像素值。
字体宽度:

int imagefontwidth ( int $font )

字体高度:

int imagefontheight ( int $font )

提示:$font为字体大小,取值1-5,最大为5。

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

//创建一个空画布
$img = imagecreatetruecolor(300,100);
//分配颜色
$color1 = imagecolorallocate($img,0,0,0); //黑色
$color2 = imagecolorallocate($img,255,0,0); //红色
//填充背景色
imagefill($img,0,0,$color1);
//获取画布的宽度和高度
$imgWidth = imagesx($img);
$imgHeight = imagesy($img);
//获取一个指定字体的宽度和高度
$font = 5;
$fontWidth = imagefontwidth($font);
$fontHeight = imagefontheight($font);
//计算字符串的起点坐标
$str = "Welcome to Itcast!";
$x = ($imgWidth-$fontWidth*strlen($str))/2;
$y = ($imgHeight-$fontHeight)/2;
//往图像上写入一行字符串(非中文)
//imagestring(图像资源,字号大小,X坐标,Y坐标,字符串,文字颜色)
imagestring($img,$font,$x,$y,$str,$color2);
//输出图像到浏览器
header("Content-Type:image/png");
imagepng($img);
//销毁图像资源
imagedestroy($img);

7、画一矩形并填充imagefilledrectangle

描述:画一矩形并填充
语法:

bool imagefilledrectangle ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $color )

参数:

\(x1 , \)y1 左上角坐标;
\(x2 , \)y2 右上角坐标;
$color 填充背景色。

8、画一个单一像素imagesetpixel

描述:画一个单一像素
语法:

bool imagesetpixel ( resource $image , int $x , int $y , int $color )

说明:imagesetpixel() 在 image图像中用 color颜色在 x,y 坐标(图像左上角为 0,0)上画一个点。

实例:绘制图像验证码

1、产生一个指定范围的数组range()

描述:建立一个包含指定范围单元的数组
语法:

array range ( mixed $start , mixed $limit [, number $step = 1 ] )

参数:

\(start 指定范围第1个值;
\)limit 指定范围最后1个值;
$step 指定步长值,必须为正整数,默认为1。

2、合并数组array_merge()

描述:合并一个或多个数组
语法:

array array_merge ( array $array1 [, array $... ] )

说明:如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。

3 shuffle

shuffle() 函数把数组中的元素按随机顺序重新排列。

shuffle(array)

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

描述:从数组中随机取出一个或多个单元
语法:

mixed array_rand ( array $input [, int $num_req = 1 ] )

参数:\(input代表当前数组 , \)num_req指明了你想取出多少个单元。

5、生成更好的随机数

描述:生成更好的随机数
语法:

int mt_rand ( int $min , int $max )

参数:min可选的、返回的最小值(默认:0);max可选的、返回的最大值。

//实例:图像验证码
/*
    (1)产生随机4位字符串
    (2)创建一个空的画布,绘制带填充的矩形
    (3)分配颜色:背景色、文字颜色
    (4)往图像上写入TTF字体串:imagettftext()
    (5)输出图像,并销毁图像
 */
//(1)产生随机4位的字符串
$arr1 = array_merge(range('A','Z'),range(0,9),range('a','z'));
shuffle($arr1); //打乱数组
shuffle($arr1); //打乱数组
$arr2 = array_rand($arr1,4); //从数组中随机取4位下标
//循环$arr2,取出指定下标对应的元素的值
$str = "";
foreach($arr2 as $index)
{
    $str .= $arr1[$index];
}

//(2)创建一个空的画布
$width = 120;
$height = 40;
$img = imagecreatetruecolor($width,$height);

//(3)绘制带填充的矩形
$color1 = imagecolorallocate($img,mt_rand(0,255),mt_rand(0,200),mt_rand(100,255));
imagefilledrectangle($img,0,0,$width,$height,$color1);

//(4)写入一行TTF的字符串:将验证码字符串,写入到图像上
$fontfile = "e:/itcast/lesson/PHP4/images/msyh.ttf";
$color3 = imagecolorallocate($img,mt_rand(0,255),mt_rand(0,200),mt_rand(100,255));
imagettftext($img,28,0,16,32,$color3,$fontfile,$str);

//(5)绘制像素点
for($i=1;$i<=200;$i++)
{
    $color2 = imagecolorallocate($img,mt_rand(0,255),mt_rand(0,200),mt_rand(100,255));
    imagesetpixel($img,mt_rand(0,$width),mt_rand(0,$height),$color2);
}

//(6)输出图像到浏览器
header("content-type:image/png");
imagepng($img);

//(7)销毁图像
imagedestroy($img);

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

描述:用 TrueType 字体向图像写入文本
语法:

array imagettftext ( resource $image , float $size , float $angle , int $x , int $y , int $color , string $fontfile , string $text )

参数:

\(size,字号大小,自定义,同word字号一样;
\)angle,旋转角度(0~360);
\(x和\)y,定义了第一个字符的基本点(大概是字符的左下角)。
\(fontfile,是想要使用的 TrueType 字体的==绝对路径==;
\)text,UTF-8 编码的文本字符串(其它编码要进行转换)。

//创建一个空画布
$img = imagecreatetruecolor(400,100);
//分配颜色
$color1 = imagecolorallocate($img,0,0,0); //黑色
$color2 = imagecolorallocate($img,255,0,0); //红色
//填充背景色
imagefill($img,0,0,$color1);
//往图像上写入一行TTF字体的文本(可以是汉字)
//imagettftext(图像资源,字号大小,旋转角度,X坐标,Y坐标,颜色,字体文件,字符串)
$fontfile = "e:/itcast/lesson/PHP4/images/msyh.ttf"; //必须是绝对路径
$str = "北京传智播客欢迎您!";
imagettftext($img,28,0,30,60,$color2,$fontfile,$str);
//输出图像到浏览器
header("Content-Type:image/png");
imagepng($img);
//销毁图像资源
imagedestroy($img);

为图像分配透明颜色imagecolorallocatealpha()

语法:

int imagecolorallocatealpha ( resource $image , int $red , int $green , int $blue , int $alpha )

说明:imagecolorallocatealpha() 的行为和 imagecolorallocate() 相同,但多了一个额外的透明度参数 alpha,其值从 0 到 127。0表示完全不透明,127 表示完全透明。

实例:制作图像水印效果

//实例:制作图像水印效果
//(1)从已知图像创建画布
$filename = "./images/img02.jpg";
$img = imagecreatefromjpeg($filename);

//(2)往图像上写入一行TTF字符串
$color = imagecolorallocatealpha($img,0xFF,0x00,0x00,100); //分配半透明颜色
$fontfile = "e:/itcast/lesson/PHP4/images/msyh.ttf";
$str = "大美女";
imagettftext($img,120,0,50,200,$color,$fontfile,$str);

//(3)输出图像,并销毁图像
header("content-type:image/png");
imagepng($img);
imagedestroy($img);

实例:生成图像缩略图

**描述:将一幅图像中的一块正方形区域拷贝到另一个图像中,平滑地插入像素值,因此,减小了图像的大小而仍然保持了极大的清晰度。 **
语法:

bool imagecopyresampled ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h )

参数:

\(dst_image,目标图像;
\)src_image,源像图;
\(dst_x和\)dst_y,目标图像x、y坐标;
\(src_x和\)src_y,源图像x、y坐标;
\(dst_w和\)dst_h,目标图像的宽度和高度;
\(src_w和\)src_h,源图像的宽度和高度;
提示:如果源和目标的宽度和高度不同,则会进行相应的图像收缩和拉伸。

//实例:制作图像缩略图,缩放到原图的一半,图像不会变形
//(1)创建画布:目标画布,原画布
$filename   = "./images/img01.jpg";
$src_img    = imagecreatefromjpeg($filename); //原画布
$src_w      = imagesx($src_img); //原画布宽度
$src_h      = imagesy($src_img); //原画布高度
$dst_w      = $src_w * 0.5; //目标画布宽度
$dst_h      = $src_h * 0.5; //目标画布高度
$dst_img = imagecreatetruecolor($dst_w,$dst_h); //目标画布

//(2)生成缩略图
imagecopyresampled($dst_img,$src_img,0,0,0,0,$dst_w,$dst_h,$src_w,$src_h);

//(3)保存图像,并销毁图像
imagejpeg($dst_img,"./images/s_img01.jpg");
imagedestroy($dst_img);
imagedestroy($src_img);
赞赏
对内容有疑问,请加我微信:guoqiang7585
# # # # #
首页      全栈教程      php高级      4、php图像处理 创建销毁 画图 验证码 水印 缩略图

国强极客

文章作者

博客站长,有问题请加微信【guoqiang7585】。

国强极客

4、php图像处理 创建销毁 画图 验证码 水印 缩略图
1、开启GD2图像扩展库 PHP不仅限于只产生HTML的输出,还可以创建与操作多种不同格式的图像文件。PHP提供了一些内置的图像处理函数,也可以使用GD函数库创建新图像或处理已有的图像。目前G…
扫描二维码继续阅读
2019-08-02