第14天 PHP图像处理及文件上传

图像处理概述

1、开启GD2图像扩展库

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

image.png

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

image.png

3、创建图像的大致步骤

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


image.png

4、画布坐标系说明

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


image.png

创建图像和销毁图像

1、创建基于已有图像的图像imagecreatefro****mpng****()

Ø 描述:由文件或 URL 创建一个新图象。
Ø 语法: resource imagecreatefrompng ( string $filename )
Ø 参数:$filename为图像的完整路径。
Ø 返回:成功后返回图象资源,失败后返回 FALSE 。
Ø 提示:imagecreatefromjpeg()和imagecreatefromgif()语法与该函数一样。

image.png

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图像资源标识符;

2、**给画图填充背景

Ø 语法imagefill(resource $image,int $x,int $y,string $color)
Ø 给画布填充颜色
Ø 参数:$image 画布 ,$x: x轴的起点,$y:y轴的起点,一般设置为0,0,代表从原点开始给画布填充颜色

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

ü 描述:以 JPG/GIF/PNG 格式将图像输出到浏览器或文件
ü 语法:bool imagejpeg ( resource $image [, string $filename [, int $quality ]] )
ü 参数:
$filename,将创建的图像保存到文件,不需要设置;如果省略,则直接在浏览器输出。
如果要省略这个参数而提供 quality 参数,使用NULL。
quality 为可选项,范围从 0(最差质量,文件更小)到 100(最佳质量,文件最大)。默认的质量值(大约 75)。
ü 提示:imagegif()、imagepng(),与imagejpeg()格式一样,但没有第3个参数。
ü 注意:如果要输出图片,需要设置相应的响应头信息:
header(‘content-type:image/jpeg’) =====>imagejpeg()
header(‘content-type:image/png’) =====>imagepng()
header(‘content-type:image/git’) =====>imagegif()

image.png

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,代表文本颜色;
image.png

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

ü 宽度:int imagesx ( resource image ) ü 高度:int imagesy ( resourceimage )

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

ü 描述:返回指定字体一个字符宽度或高度的像素值。
ü 字体宽度:int imagefontwidth ( int $font )
ü 字体高度:int imagefontheight ( int $font )

ü 提示:$font为字体大小,取值1-5,最大为5。6、实例:在图像上绘制一行居中的字符串

image.png

6、案例:写一段文字在画布中,居中显示

image.png

效果:


image.png

7、画一矩形并填充

ü 描述:画一矩形并填充
ü 语法:bool imagefilledrectangle ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $color )
ü 参数:

$x1 , $y1 左上角坐标;
$x2 , $y2 右下角坐标;
$color 填充背景色。
image.png

8、画一个单一像素

ü 描述:画一个单一像素
ü 语法:bool imagesetpixel ( resource $image , int $x , int $y , int $color )
ü 说明:imagesetpixel() 在 image图像中用 color颜色在 x,y 坐标(图像左上角为 0,0)上画一个点。

image.png

image.png

9、在画布上画线

ü 描述:画一个单一像素
ü 语法:bool imageline( resource $image , int $x1 , int $y1,int $x2, int $y2 ,int $color )
ü 参数:

$image 画布资源;
$x1线的x轴的起点,
$y1线的y轴的起点;
$x2,$y2线的X轴和Y轴的终点;
$color线的颜色
image.png

image.png

实例:图像验证码

步骤:
1)产生随机4位字符串
2)创建空的画布,绘制带填充的矩形
3)分配颜色:背景色、文字颜色
4)往图像上写入TTF字体串:imagettftext()
5)输出图像并晓辉图像资源

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

9、向图像中写入文本

ü 描述:用 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 编码的文本字符串(其它编码要进行转换)。
image.png

实例:制作图像水印效果

ü 描述:为图像分配透明颜色imagecolorallocatealpha()
ü 语法:int imagecolorallocatealpha( resource $image , int $red , int $green , int $blue , int $alpha )
ü 说明:imagecolorallocatealpha() 的行为和 imagecolorallocate() 相同,但多了一个额外的透明度参数 alpha,其值从 0 到 127。0表示完全不透明,127 表示完全透明。
实质上就是往一张图片(打开的画布)上面放内容

image.png

image.png

实例:生成图像缩略图

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

ü 语法: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,源图像的宽度和高度;

ü 提示:如果源和目标的宽度和高度不同,则会进行相应的图像收缩和拉伸。
就是新创建一个画布,把原图盖在新画布上


image.png

效果:


image.png

文件上传

1、文件上传原理

ü 上传文件,就是将文件从浏览器端传到服务器端;
ü 上传文件,必须使用<form>标记来向服务器端发数据;
ü 上传文件,<form>标记的method属性值必须是POST;
ü 上传文件,<form>标记的enctype属性值必须是multipart/form-data;
ü 上传文件,必须使用<input type = ‘file’ name=’upload’>标记实现。


image.png

image.png

2、超全局变量数组 $_FILES

Ø $_POST数组中保存的是普通表单元素数据;
Ø $_FILES数组中保存的是上传文件的信息。

image.png

3、上传文件错误代码

image.png

提示:0、1、4比较重要。

4、查看上传的临时文件位置

ü 上传文件的默认临时目录,如果没有指定php.ini配置项upload_tmp_dir的值,则使用操作系统临时目录(c:\windows\temp)。通过phpinfo()函数查看。
ü 为什么在 c:\windows\temp 中看不到上专文件呢?因为临时文件是短暂存在的,也就是在脚本执行完毕后,就消失了。


image.png

image.png

5、将上传文件移动到新位置

ü 描述:本函数检查并确保由 filename 指定的文件是合法的上传文件(即通过 PHP 的 HTTP POST 上传机制所上传的)。如果文件合法,则将其移动为由 destination 指定的文件。最好在临时文件没有消失前移动。
ü 语法:bool move_uploaded_file ( string $filename , string $destination )
ü 参数:$filename,指定上传的临时文件名;$destination,指定新的文件名路径;
ü 注意:如果文件已经存在,则会覆盖操作。

image.png

6、上传文件的相关配置(php.ini)

ü upload_max_filesize配置:上传单个文件的大小限制,默认为2MB。
ü post_max_size配置:规定上传多个文件的总大小,默认为8MB。
ü max_file_uploads配置:规定最多上传的文件个数,默认为20个。


image.png

image.png

7、获取文件路径信息 pathinfo()

ü 描述:返回文件路径的信息 ;
ü 语法:mixed pathinfo ( string $path [, int $options = PATHINFO_DIRNAME | PATHINFO_BASENAME | PATHINFO_EXTENSION | PATHINFO_FILENAME ] )
ü 参数:

$path,要解析的路径。
$options,如果省略,返回全部单元;
PATHINFO_DIRNAME,目录名称;
PATHINFO_BASENAME,文件名称;
PATHINFO_EXTENSION,扩展名;
PATH_FILENAME,文件名。

8、生成唯一ID uniqid()

ü 描述:生成一个唯一ID
ü 语法:string uniqid ([ string $prefix = "" [, bool $more_entropy = false ]] )
ü 参数:

$prefix前缀字符串,如果省略,返回字符串长度为13;
$more_entropy后缀字符串,如果为true,返回字符串长度为23。
image.png

文件上传注意事项
1、表单的enctype属性设置为multipart/form-data
2、错误情况判断:
1)是否有上传错误 error
2)判断上传的大小是否超过了配置文件中允许的大小
3)判断上传的文件是否是图片
4)移动文件

实例:单个文件上传

1、制作表单


image.png

2、文件上传


image.png

image.png

image.png

实例:多个文件上传

1、上传表单


image.png

2、服务器处理


image.png

列表展示:


image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容