一、使用gd2之前首先要开启gd2扩展
Windows下面找到php的配置文件php.ini,搜索extension=php_gd2.dll,去掉前面的分号即可;
由于gd2的函数比较的长,所有对部分函数进行介绍
1.imagecreatetruecolor — 新建一个真彩色图像
imagecreatetruecolor ( int $width , int $height ); //$width图像宽度 $height图像高度
返回值:成功返回图象资源,失败返回 FALSE 。
2.imagecolorallocate — 为一幅图像分配颜色
imagecolorallocate ( resource $image , int $red , int $green , int $blue );
返回值:分配失败则返回 -1。
3.imagecopyresampled — 重采样拷贝部分图像并调整大小
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目标X坐标点 $dst_y目标Y坐标点 $src_x源的X坐标点 $src_y源的Y坐标点 $dst_w目标宽度 $dst_h目标高度 $src_w源图象的宽度 $src_h源图象的高度
返回值:成功时返回 TRUE, 或者在失败时返回 FALSE。
4.imagecopymerge — 拷贝并合并图像的一部分
imagecopymerge ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h , int $pct );//将 src_im 图像中坐标从 src_x,src_y 开始,宽度为 src_w,高度为 src_h 的一部分拷贝到 dst_im 图像中坐标为 dst_x 和 dst_y 的位置上。两图像将根据 pct 来决定合并程度,其值范围从 0 到 100
5.imagejpeg —将图像输出到浏览器或文件
imagejpeg ( resource $image [, string $filename [, int $quality ]] );//从 image 图像以 filename 为文件名创建一个 JPEG 图像。
返回值:成功时返回 TRUE, 或者在失败时返回 FALSE。
6.imagecolorallocatealpha — 为一幅图像分配颜色和透明度
imagecolorallocatealpha ( resource $image , int $red , int $green , int $blue , int $alpha );//透明度参数alpha,其值从0到127。0 表示完全不透明,127 表示完全透明
返回值:颜色标识符或FALSE分配失败。此函数可能返回布尔值 FALSE,但也可能返回等同于 FALSE 的非布尔值。
7.imagettftext — 用TrueType字体向图像写入文本
imagettftext ( resource $image , float $size , float $angle , int $x , int $y , int $color , string $fontfile , string $text );//$image画布资源 $size字体大小 $angle旋转角度 $x x轴 $y y轴 $color字体颜色 $fontfile字体文件 $text需要渲染的字符串
返回值:返回一个含有 8 个单元的数组表示了文本外框的四个角,顺序为坐下角,右下角,右上角,左上角。这些点是相对于文本的而和角度无关,因此“左上角”指的是以水平方向看文字时其左上角。
8.imagefill — 区域填充
imagefill ( resource $image , int $x , int $y , int $color );//在 image 图像的坐标 x,y(图像左上角为 0, 0)处用 color 颜色执行区域填充(即与 x, y 点颜色相同且相邻的点都会被填充)
9.imagesetpixel — 画一个单一像素
imagesetpixel ( resource $image , int $x , int $y , int $color );//在 image 图像中用 color 颜色在 x,y 坐标(图像左上角为 0,0)上画一个点
10.imageline — 画一条线段
imageline ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $color );// color 颜色在图像 image 中从坐标 x1,y1 到 x2,y2(图像左上角为 0, 0)画一条线段
11.imagestring — 水平地画一行字符串
imagestring ( resource $image , int $font , int $x , int $y , string $s , int $col );//用 col 颜色将字符串 s 画到 image 所代表的图像的 x,y 坐标处(这是字符串左上角坐标,整幅图像的左上角为 0,0)。如果 font 是 1,2,3,4 或 5,则使用内置字体
12.imagedestroy — 销毁一图像
imagedestroy ( resource $image );
一、生成验证码
//向浏览器输出图片头信息
header('Content-type:image/jpeg');
$width = 130;
$height = 50;
$arr = array('1','2','3','4','5','6','7','8','9','0','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');
$string = '';
for ($i = 0; $i < 5; $i++) {
$string .= $arr[rand(0,count($arr)-1)];
}
//新建一个真彩色图像
$img = imagecreatetruecolor($width, $height);
//为一幅图像分配颜色
$bgColor = imagecolorallocate($img, rand(200,255), rand(200,255), rand(200,255));
//区域填充
imagefill($img, 0, 0, $bgColor);
//该循环,循环画背景干扰的点
for ($i = 0; $i <= 100; $i++) {
//点的颜色
$pointColor = imagecolorallocate($img, rand(0,255), rand(0,255), rand(0,255));
//水平的画一串像素点
imagesetpixel($img, rand(0,$width-1), rand(0,$height-1), $pointColor);
}
//该循环,循环画干扰直线
for ($i = 0; $i <= 4; $i++) {
//线的颜色
$lineColor = imagecolorallocate($img, rand(0,255), rand(0,255), rand(0,255));
//画一条线段
imageline($img, rand(0,$width), rand(0,$height), rand(0,$width), rand(0,$height), $lineColor);
}
$colorString = imagecolorallocate($img, rand(10,100), rand(10,100), rand(10,100));
//1.用TrueType字体向图像写入文本
imagettftext($img,25,7,rand(30,40),rand(35,40),$colorString,'simsun.ttc',$string);
//2.水平地画一行字符串(5是最大的)
//imagestring($img,5,rand(0,$width-36),rand(0,$height-15),$string,$colorString);
//输出图片到浏览器
imagejpeg($img);
//销毁,释放资源
imagedestroy($img);
ps:事先要下载simsun.ttc文件到本地(在win里搜索 字体 就行)。
//要添加文字水印的图片
$srcImg = 'example.jpg';
//如果是某某云的资源链接就用 file_get_contents()先下载到本地再操作
//获取图片信息
$imageInfo = getimagesize($srcImg);
//通过编号获取图像类型
$type = image_type_to_extension($imageInfo[2], false);
//在内存中创建和图像类型一样的图像
$fun = "imagecreatefrom" . $type;
//图片复制到内存
$image = $fun($srcImg);
//设置字体的路径
$font = "simsun.ttc";
//填写水印内容
$content = "武汉加油!";
$text = '中国加油!';
//设置字体颜色和透明度
$color = imagecolorallocatealpha($image, 50, 50, 50, 0);
//写入文字
imagettftext($image, 50, 0, 130, 250, $color, $font, $content);
imagettftext($image, 40, 0, 140, 350, $color, $font, $text);
//浏览器输出
header("Content-type:".$imageInfo['mime']); //******
$fun = "image" . $type;
//在浏览器中输出图片
$fun($image); //******
//添加水印之后的图片 图片路径名称
$imgPathName = 'newImage.png';
//保存图片
$fun($image, $imgPathName);
//销毁图片
imagedestroy($image);
ps:如果不想在浏览器输出就注释带//******的两行
效果:
/**操作背景图片**/
//背景图片路径
$src = "example.jpg";
//获取图片信息
$info = getimagesize($src);
//通过图片的编号获取获取图片的类型
$type = image_type_to_extension($info[2],false);
//在内存中创建一个和我们图像类型一样的图像
$fun = "imagecreatefrom{$type}";
//把要操作的图片复制到内存中
$image = $fun($src);
/**操作logo**/
//水印路径
$logoImage = "logo.png";
//获取水印图片的类型
$logoInfo = getimagesize($logoImage);
//通过水印图片的编号获取水印图片的类型
$logoType = image_type_to_extension($logoInfo[2],false);
//在内存中创建一个和水印图片一样的图像
$logoFun = "imagecreatefrom{$logoType}";
//把水印图片复制到内存中
$logo = $logoFun($logoImage);
//将两张图片拷贝到一起
imagecopymerge($image, $logo, 300, 280, 0, 0, $logoInfo[0], $logoInfo[1],70);
//销毁水印图片
imagedestroy($logo);
//在浏览器中输出图片
header("Content-Type:".$info['mime']);
$newImgFun = "image{$type}";
$newImgFun($image);
//保存图片
$newImgFun($image,'newImage.jpg');
//销毁图片
imagedestroy($image);
效果: