PHP图像处理

处理图片的场景由很多,以下是比较常见的几种:
1.生成验证码
2.图片缩放
3.图片水印
4.柱状图
5.密保口令卡
PHP由GD系统来处理图像,它可以创建和处理包括GIF、PNG、JPEG、WBMP、XPM在内的多种格式的图像,并且直接将图像数据流输出到浏览器。
如果要进行图像处理,比如有GD库的支持,我们要查看当前机器是否安装了GD扩展,利用phpinfo()函数查看,如果由gd选项,则说明当前机器支持图像处理。如果没有看到也没有搜索到,就需要我们手动将其打开,打开php.ini,在windows中,需要将GD2的DLL文件php_gd2.dll作为一个扩展包含在php.ini中。修改;extension=php_gd2.dll,将前面的分号去掉,然后重启、查看。
首先是简单的图形,可以直接用线段画出,并且将其保存为图片,具体如下:
(1.使用imagecreate()函数创建一个画布,并返回画布的句柄。
(2.使用imagecolorallocate()函数来准备之后需要画画所需要的颜色,并返回颜色的句柄,使用imagecoorallocate()函数是为一副图像分配颜色,但是如果是第一次分配颜色则会将该颜色填充为背景色。
(3.在画布中进行填充,可以填充矩形imagefilledrectangle()、画直线imageline()、填充圆imagedfilledellipse()
(4.将画好的图片使用imagejpeg()函数将其保存为.jpg格式的图片,并销毁画布资源
然后是生成验证码,生成验证码其实就是随机生成字符串,然后将其以图形的形式将其表示出来,具体步骤如下:
(1.创建画布
(2.生成随机数,这个时候可以利用mt_rand()函数生成随机数字,然后利用ASCII码变成随机字符串,由于0~9的ASCII码在48~57之间、A~Z的ASCII码在65~90之间、a~z的ASCII码在97~122之间,这些字符串中间还有一些空白,所以必须要分开进行,先生成一个随机数判断是在哪个范围,再在此范围里面生成一个字符串的随机ASCII值,最后将ASCII码值转换成字符串利用sprintf将其转化成对应的格式,比如要转化成string类型,则是springf('%c'.$ascii);,然后将其与之前生成的字符串连接起来,代码如下:
<code lang="php">
$num=4;
for($i=0;$i<$num;$i++){
    $rand=mt_rand(0,2);
    switch ($rand){
        case 0:
            $ascii = mt_rand(48,57);//0-9
            break;
        case 1:
            $ascii = mt_rand(65,90);//A-Z
            break;
        case 2:
            $ascii = mt_rand(97,122);//a-z
            break;
    }
    $randomstr =$randomstr.sprintf('%c',$ascii);
}
</code>
这里有可能会有个提示Notice: Undefined variable: randomstr in F:\html\myself\forpic\index.php on line 48,因为$randomstr是没有定义的变量,虽然一般来说php是不需要定义这个变量的,但是如果环境默认的话,是会显示这个提示的,虽然没有什么大问题,不过还是要将其隐藏起来,这个时候就要根据错误级别来确定是否隐藏,一般实在php.ini里面修改
1) error_reporting设置:
找到error_reporting = E_ALL
修改为error_reporting = E_ALL & ~E_NOTICE
2) register_globals设置:
找到register_globals = Off
修改为register_globals = On
或者在php代码中直接使用
error_reporting(E_ALL & ~E_NOTICE);
(3.在画布中放置干扰元素,比如将画布看起来显得粗糙,添加一些横线什么的,首先需要给画布生成一个随机的背景色,不过为了易于辨识验证码,所以背景需要是浅色调的颜色,所以RGB的值必须都大于120,然后是为干扰像素点生成一个随机颜色。最后是在画布中随机的画上像素点,使用imagesetpixel()函数可以简单方便的画出指定数量的像素点,最后加上字符串,一般是四个字符串,所以要将画布按宽度等分成四份,然后将每个字符串以图像的形式放置,使用imagechar()可以快速的将字符串转化成图像。代码如下:
<code lang="php">
$color = imagecolorallocate($img,mt_rand(130,255),mt_rand(130,255),mt_rand(130,255));//画布底色
$pix = imagecolorallocate($img,mt_rand(0,120),mt_rand(0,120),mt_rand(0,120));//随机干扰与元素的颜色
for($i=0;$i<50;$i++){
    imagesetpixel($img,mt_rand(0,300),mt_rand(0,200),$pix);
}
//加上字符串
for($i=0;$i<4;$i++){
    $x = floor($width/$num)* $i;
    $y = mt_rand(0,$height-15);
    imagechar($img,10,$x,$y,$randomstr[$i],$pix);
}
imagejpeg($img,'identify.jpg');
echo '<img src="identify.jpg" />';
imagedestroy($img);
</code>
(4.保存图片,销毁资源。
图片缩放主要是利用imagecopyresampled()函数和imagecopyresized()函数来进行的,imagecopyresample()函数可以重采样拷贝部分图像并调整大小,而imagecopyresize()可以拷贝部分图像并调整大小。因为是要裁剪或者缩放图片,所以要有来源图片,用imagecreatefromjpeg()函数打开来源图片,然后获取图片参数。然后使用imagecreatetruecolor()来创建一个想要的大小的图片作为目标图片的大小,最后将来源图片进行操作之后放入目标图片,这样就完成了图片的缩放了。
代码如下:
<code lang="php">
$image = imagecreatefromjpeg('demo.jpg');
list($width,$height)=getimagesize('demo.jpg');
echo $width.' '.$height.'<br>';
$new_img = imagecreatetruecolor(0.1*$width,0.1*$height);
$new_img1 = imagecreatetruecolor(0.5*$width,0.5*$height);
imagecopyresampled($new_img,$image,0,0,0,0,0.1*$width,0.1*$height,$width,$height);
imagecopyresized($new_img1,$image,0,0,0,0,0.5*$width,0.5*$height,$width,$height);
//header('content-type:image/jpeg');
imagejpeg($new_img,'demo2.jpg');
echo '<img src="demo2.jpg"/>';
imagejpeg($new_img1,'demo3.jpg');
echo '<img src="demo3.jpg"/>';
</code>
其中imagecopysampled()和imagecopyresiezed()函数具体使用参数为:bool imagecopyresampled ( resource $目标图 , resource $来源图 , int $目标开始的x位置 , int $目标开始的y位置 , int $来源开始的x位置 , int $来源开始的y位置 , int $目标图片的宽 , int $目标图片的高, int $来源图片的宽 , int $来源图片的高 )。
然后就是图片水印,图片水印其实只要把想要作为水印的图片进行缩放放到需要水印的图片上,并且设置好透明度使水印不会阻挡源图片的观看,但是要将一张图片合并到另一张图片上需要imagecopymerge()函数将其合并,这里就不贴代码了。
接下来就是柱状图和密保口令卡了,柱状图没有教程,所以要自己找,而且看起来比较难,所以就单独作为一个小实践吧,密保口令卡和数据库操作有关,而且也要自己找教程,所以就先放着,等我学完数据库再来搞这个....