• gd库的相关内容


    gd库注意事项

    对于乱码问题

    在php里面包含

    header("content-type:image/png");
    

    这样输出的图像就不会乱码了后面跟的Png也可以改变为自己想要输出的图像格式,在这个时候如果var_dump();那么就会出错误,因为输出的是图片格式,需要用到var_dump()的时候注释掉就可以了。

    关于图像的画布创建

    imageCreateTrueColor(height,weidth);//创建画布设置宽高
    

    创建颜色对象

    imageColorAllocate(img_resource,r,g,b);//设置画布的颜色
    

    填充画布背景颜色

    imageFill(img_resource,x,y,color);
    

    (x,y)表示从哪里开始填充颜色不写的话默认是黑色的

    出现的问题:在设置起始填充位置时如果超出画布大小则会以默认颜色填充

    绘制矩形

    空心

    imagerectangle(img_resource,x1,y1,x2,y2,color);
    

    x1,y1左上角

    x2,y2右下角

    实心

    imagefilledrectangle(img_resource,x1,y1,x2,y2,color);
    

    绘制圆形

    空心

    imageellipse(img_resource,x,y,圆形的上下长,圆形的左右长,color);
    

    x,y表示的圆心位置

    实心

    imagefilledellipse(img_resource,x,y,圆形的上下长,圆形的左右长,color);
    

    绘制线条

    imageline(img_resource,x1,y1,x2,y2,color)
    

    x1,y1起始位置坐标

    x2,y2终点位置坐标

    设置绘制线条的宽度

    imagesetthickness(img_resource,width);//设置绘制线条的宽度
    

    在绘制某一图形之前设置

    要绘制两个宽度不一样的线条,案例如下

    imagesetthickness($im,20);
    imageline($im,0,0,500,500,$blue);
    imagesetthickness($im,10);
    imageline($im,0,500,500,0,$blue);
    

    这样,两条线就得到了不同的宽度

    设置填充的样式

    imagesetstyle($im,[$red,$blue,$green]);
    

    一样在绘制前设定上面的案例指的是填充的是三色交替的样子,设置完之后要想看到效果,

    imageline(img_resource,x1,y1,x2,y2,IMG_COLOR_STYLED)//颜色资源要改成这个常量IMG_COLOR_STYLED
    

    画一个点(实用性一般用于对验证码产生干扰点防止一些软件识别验证码)

    imagesetpixel($im,x,y,color);
    

    案例如下

    <?php
    header('Content-type:image/JPG');//设置输出的图像格式
    $im = imagecreatetruecolor(500,500);//创建画布
    $red=imageColorAllocate($im,225,0,0);//创建颜色对象
    $green = imagecolorallocate($im, 0,225,0); 
    $blue = imagecolorallocate($im, 0,0,225); 
    $white=imagecolorallocate($im, 255,255,225); 
    imageFill($im,0,0,$white);//画布背景填充颜色,默认黑色
    imagesetpixel($im,250,250,$red);
    for($i=0;$i<1000;$i++){
        imagesetpixel($im,mt_rand(0,500),mt_rand(0,500),$red);//此处细节,mt_rand();性能高与rand();
    }
    imagepng($im);                 
    ?>
    

    同理把绘制点改为线就能出线干扰线,有兴趣的可以试试我下面的代码跑着玩,每刷新一次又出现新的线条,很有意思的

    <?php
    header('Content-type:image/JPG');//设置输出的图像格式
    $im = imagecreatetruecolor(500,500);//创建画布
    $red=imageColorAllocate($im,225,mt_rand(0,255),0);//创建颜色对象
    $green = imagecolorallocate($im, 0,225,0); 
    $blue = imagecolorallocate($im, 0,0,225); 
    $white=imagecolorallocate($im, 255,255,225); 
    imageFill($im,0,0,$white);//画布背景填充颜色,默认黑色
    imagesetpixel($im,250,250,$red);
    for($i=0;$i<100;$i++){
        imagesetthickness($im,mt_rand(0,50));
        $red=imageColorAllocate($im,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));//创建颜色对象
        imageline($im,mt_rand(0,500),mt_rand(0,500),mt_rand(0,500),mt_rand(0,500),$red);
    }
    imagepng($im);                 
    ?>
    

    图像的保存和显示

    显示我们已经用到过了的

    imagepng($im);//在浏览器显示资源
    
    imagepng($im,'文件名.png');//保存资源,路径在和代码所在位置同一路径
    

    结束后记得清理内存,图像会占用内存

    imagedestroy($im);//操作完成后清理内存
    

    显示文字在图像中(主要应用与验证码)

    imagettftext($im,size,angle,x,y,color,$font,$text);
    

    size:字体大小,angle:角度,起始打印位置(x,y),颜色color,font:字体资源路径,text文字内容

    案例如下

    <?php
    header('Content-type:image/JPG');//设置输出的图像格式
    $im = imagecreatetruecolor(500,500);//创建画布
    $red=imageColorAllocate($im,225,0,0);//创建颜色对象
    $green = imagecolorallocate($im, 0,225,0); 
    $blue = imagecolorallocate($im, 0,0,225); 
    $white=imagecolorallocate($im, 255,255,225); 
    imageFill($im,0,0,$white);//画布背景填充颜色,默认黑色
    $font="c:/windows/fonts/simhei.ttf";//设置字体路径,我用的是windos自带的字体
    $text='hello';//设置文本内容
    for($i=0;$i<mb_strlen($text,'utf-8');$i++)//这里mb_strlen($text,'utf-8')这里是为了中文的输出,按中文计算
    //字符串长度
    {
        $color=imageColorAllocate($im,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));//创建随机的颜色对象
        imagettftext($im,20,mt_rand(-80,80),20+20*$i,mt_rand(20,30),$color,$font,mb_substr($text,$i,1,'utf-8'));//这里的mb_substr同样是为了中文的输出
    }
    imagepng($im);      
    imagedestroy($im);            
    ?>
    

    mb_substr( $str, $start, $length, $encoding )
    $str,需要截断的字符串
    $start,截断开始处,起始处为0
    $length,要截取的字数
    $encoding,网页编码,如utf-8,GB2312,GBK

    文本盒子的概念(实用性,指定位置打水印)

    能够装下文字的盒子

     imagettfbbox ($size,$angle,$fontfile,$text)
    
    imagettfbbox() 返回一个含有 8 个单元的数组表示了文本外框的四个角:
    0	左下角 X 位置
    1	左下角 Y 位置
    2	右下角 X 位置
    3	右下角 Y 位置
    4	右上角 X 位置
    5	右上角 Y 位置
    6	左上角 X 位置
    7	左上角 Y 位置
    

    知道了四个角的坐标点我们就可以来求出文本所占的宽高,从而控制文字所在位置

    <?php
    header('Content-type:image/JPG');//设置输出的图像格式
    $im = imagecreatetruecolor(500,500);//创建画布
    $red=imageColorAllocate($im,225,0,0);//创建颜色对象
    $green = imagecolorallocate($im, 0,225,0); 
    $blue = imagecolorallocate($im, 0,0,225); 
    $white=imagecolorallocate($im, 255,255,225); 
    imageFill($im,0,0,$white);//画布背景填充颜色,默认黑色
    $font="c:/windows/fonts/simhei.ttf";
    $text='我爱你亲爱的姑娘';
    $size=30;
    $box=imagettfbbox($size,0,$font,$text);
    $width=$box[2]-$box[0];
    $height=$box[1]-$box[7];
    imagettftext($im,$size,0,250-$width/2,250,$red,$font,$text);
    imagepng($im);      
    imagedestroy($im);            
    ?>
    
  • 相关阅读:
    常见的http状态码
    浅谈!DOCTYPE声明的作用?严格模式与混杂模式的区别?
    异步控制---实现函数asyncAll,在执行完传入数组中func1,func2,func3异步函数后,输出“end”
    Ecmascript 6新特性
    关于数组去重的几种方法-------javascript描述
    关于字符串的一些操作
    写一个将字符串转成驼峰命名的方法
    js作用域之常见笔试题,运行结果题
    CSS3实现图片黑白滤镜居中,hover缩放遮罩的效果
    远程桌面与本地桌面实现文件传输
  • 原文地址:https://www.cnblogs.com/chenguosong/p/11846403.html
Copyright © 2020-2023  润新知