■ 检测GD库是否已开启:
GD库默认不开启,需要自己打开。
通过 gd_info() 判断GD库是否已开启:
gd_info() ——作用:取得当前安装的 GD 库的信息。
开启GD库:
在 php.ini 中找到 extension=php_gd2.dll ,去掉注释(去掉前面的分号)。
print_r(gd_info()); //gd_info() 取得当前安装的 GD 库的信息。
以上语句打印内容如下:
Array
(
[GD Version] => bundled (2.1.0 compatible) <——— GD库的版本。
[FreeType Support] => 1 <——— 是否支持免费字体。
[FreeType Linkage] => with freetype
[T1Lib Support] =>
[GIF Read Support] => 1 <——— 是否支持读取gif图片。
[GIF Create Support] => 1 <——— 是否支持创建gif图片。
[JPEG Support] => 1 <——— 是否支持对jpeg图片的操作。
[PNG Support] => 1 <——— 是否支持对png图片的操作。
[WBMP Support] => 1 <——— 是否支持对bmp图片的操作。
[XPM Support] => 1
[XBM Support] => 1
[JIS-mapped Japanese Font Support] =>
)
■ 计算机图形的相关基础:
● 坐标以左上角为原点。
● 以像素为单位。
● 已知 x轴坐标 与 y轴坐标 可以确定一个点。
● 确定一个矩形有两种方法:
① 已知 两个点 可以确定一个矩形。
② 已知 左上角的点、宽度、高度 可以确定一个矩形。
■ GD库 图片处理流程:
我们要使用GD库处理图像,首先要知道 图像处理流程 。
图像处理流程分为5步:
1. 创建画布;
2. 创建颜色;
3. 编辑图像;
4. 输出或保存画布;
5. 销毁画布。
每一步都有对应的函数,下面逐一介绍。
第一步,创建画布
创建画布有两种方式:
① 直接创建一张空的画布;
② 打开一张图片作为画布。
★注意:创建画布会返回一个『画布资源』。
$width = 300;
$height = 200;
// ① 创建一张空的画布(默认全黑),并制定其大小:
画布资源 = imagecreatetruecolor($width,$height);
// ② 直接打开一张图片作为画布:
画布资源 = imagecreatefromgif(图片路径); // 打开一个gif图片作为画布。
画布资源 = imagecreatefromjpeg(图片路径); // 打开一个jpg图片作为画布。
画布资源 = imagecreatefrompng(图片路径); // 打开一个png图片作为画布。
画布资源 = imagecreatefromwbmp(图片路径); // 打开一个bmp图片作为画布。
第二步,创建颜色(调颜料)
函数 imagecolorallocate() 用于为画布创建颜色。
该函数返回一个代表给定的R、G、B所组成的颜色标识符。
$r = 0;
$g = 0;
$b = 255;
颜色标识符 = imagecolorallocate(画布资源,$r,$g,$b); // 创建蓝色。
第三步,编辑图像
以下是编辑图像的函数,编辑图像的函数参数较多:
//画直线:
imageline(画布资源,$x1,$y1,$x2,$y2,颜色标识符); // 画一条线段。
imagesetstyle(画布资源,$arr_style); // 设定画线的风格。
★注意:
①参数 $arr_style 为数组,其内容为输出画线的风格,例如:
$white = imagecolorallocate($image,255,255,255);
$red = imagecolorallocate($image,230,0,0);
$arr_style = array($red,$red,$red,$red,$white,$white,$white,$white);
②如果设定了画线风格,imageline中的“颜色标识符”就要改为 IMG_COLOR_STYLED 例如:
imageline($image,0,0,800,500,IMG_COLOR_STYLED);
//写字:
imagestring(画布资源,字体大小1~5,$x,$y,字符串内容,颜色标识符); // 水平地写一行字符串。
imagettftext(画布资源,字体大小像素,逆时针旋转的角度,$x,$y,颜色标识符,字体库文件,文本内容); // 用 TrueType 字体向图像写入文本(可以写中文)。
// ★注意:使用 imagettftext() 前需要先提供一个ttf字体库文件。
//画图形:
imageellipse(画布资源,$x,$y,宽,高,颜色标识符); // 画一个椭圆。
imagerectangle(画布资源,$x1,$y1,$x2,$y2,颜色标识符); // 画一个矩形。
imagepolygon(画布资源,顶点坐标数组,顶点的总数,颜色标识符); // 画一个多边形。
imagearc(画布资源,$x,$y,宽,高,起始角度,结束角度,颜色标识符); // 画椭圆弧。
// ★注意:0°位于三点钟位置,以顺时针方向绘画。
//填充:
imagefill(画布资源,$x,$y,颜色标识符); // 区域填充(常用于设定背景颜色)。
imagefilledellipse(画布资源,$x,$y,宽,高,颜色标识符); // 画一个椭圆并填充。
imagefilledrectangle(画布资源,$x1,$y1,$x2,$y2,颜色标识符); // 画一个矩形并填充。
imagefilledpolygon(画布资源,顶点坐标数组,顶点的总数,颜色标识符); // 画一个多边形并填充。
imagefilledarc(画布资源,$x,$y,宽,高,起始角度,结束角度,颜色标识符,$style); // 画一个椭圆弧且填充。
★注意:
参数 $style 可以是下列两个值按位或(即 or)后的值(将两个效果组合):
IMG_ARC_PIE 值为 0 表示产生圆形边界(弧)。
IMG_ARC_CHORD 值为 1 表示只用直线连接了起始和结束点(弦)。
IMG_ARC_NOFILL 值为 2 指明弧或弦只有轮廓,不填充。
IMG_ARC_EDGED 值为 4 指明用直线将起始和结束点与圆心点相连(并填充)。
其中 IMG_ARC_PIE 和 IMG_ARC_CHORD 是互斥的,如果两个都用,IMG_ARC_CHORD 生效。
IMG_ARC_EDGED 和 IMG_ARC_NOFILL 一起使用(即值为6)是画饼状图轮廓的好方法(而不用填充)。
//取图像宽、高:
imagesx(画布资源); // 取得图像宽度。
imagesy(画布资源); // 取得图像高度。
//图像复制:
imagecopy(b画布的资源,a画布的资源,$b_x,$b_y,$a_x,$a_y,$a_w,$a_h);
// 将 a画布中 从坐标$a_x,$a_y开始,取宽度为$a_w,高度为$a_h 的一部分拷贝到 b画布中坐标为$b_x,$b_y 的位置上。
imagecopymerge(b画布的资源,a画布的资源,$b_x,$b_y,$a_x,$a_y,$a_w,$a_h,★透明度);
// 将 a画布中 从坐标$a_x,$a_y开始,取宽度为$a_w,高度为$a_h 的一部分拷贝到 b画布中坐标为$b_x,$b_y 的位置上。透明度从 0 到 100。
imagecopyresampled(b画布的资源,a画布的资源,$b_x,$b_y,$a_x,$a_y,$a_new_w,$a_new_h,$a_w,$a_h);
// 将 a画布中 从坐标$a_x,$a_y开始,取宽度为$a_w,高度为$a_h 的一部分,以新宽度 $a_new_w 和 新高度 $a_new_h 拷贝到 b画布中坐标为$b_x,$b_y 的位置上。
第四步,输出或保存图片
有些时候,我们并不需要保存画布,例如做验证码。
这时候我们可以直接输出,不保存。
imagepng(画布资源 [,保存路径]); // 生成 png 图片,如果不写『保存路径』就只输出不保存。
imagegif(画布资源 [,保存路径]); // 生成 gif 图片,如果不写『保存路径』就只输出不保存。
imagejpeg(画布资源 [,保存路径 [,质量值]]); // 生成 jpeg 图片,如果不写『保存路径』就只输出不保存。
imagewbmp(画布资源 [,保存路径 [,前景色]]); // 生成 bmp 图片,如果不写『保存路径』就只输出不保存。
// ★注意:① 若要通过以上4个函数之一直接在浏览器中输出图像,则必须在其之前加上以下语句:
header('content-type:image/图像格式'); //作用:告诉浏览器,接下来的内容是图像信息,要以图像的形式输出内容。
// ★注意:② 若要在浏览器输出图像,则在输出语句前 绝对不可以出现任何文字输出语句。
第五步,销毁画布
imagedestroy(画布资源);
■ 判断图像类型:
不能通过图像的后缀来判断图像类型。这样相当不可靠。
通过系统函数 getimagesize() 获得图片的信息,再从图片信息中取得图像类型。
★注意:getimagesize() 不需要GD库。
函数 getimagesize() 返回一个具有四个元素的数组。
索引 [0] 包含图像宽度的像素值。
索引 [1] 包含图像高度的像素值。
索引 [2] 是图像类型的标记:
1 = GIF,
2 = JPG,
3 = PNG,
4 = SWF,
5 = PSD,
6 = BMP,
7 = TIFF(intel byte order),
8 = TIFF(motorola byte order),
9 = JPC,
10 = JP2,
11 = JPX,
12 = JB2,
13 = SWC,
14 = IFF,
15 = WBMP,
16 = XBM。
这些标记与 PHP 4.3.0 新加的 IMAGETYPE 常量对应。
索引 [3] 是文本字符串,内容为“height="yyy" width="xxx"”,可直接用于 IMG 标记。
getimagesize(图像路径); // 取得图像的信息。
■ 实现验证码扭曲:
imagecolorat() 与 imagesetpixel() 常用于实现验证码扭曲效果。
imagecolorat(图像资源,x轴坐标,y轴坐标); // 取得某像素的颜色标识符。
imagesetpixel(图像资源,x轴坐标,y轴坐标,颜色标识符); // 画一个单一像素。