>  기사  >  백엔드 개발  >  PHP 기본 튜토리얼 16: 그래픽 그리기에 GD 라이브러리 사용

PHP 기본 튜토리얼 16: 그래픽 그리기에 GD 라이브러리 사용

黄舟
黄舟원래의
2017-03-01 10:24:266606검색

서문

우리는 웹페이지에 로그인하기 위해 온라인에 접속할 때 대부분의 경우 인증 코드를 입력해야 합니다. , PHP 프로그래머는 상황에 따라 스스로 인증 코드를 그릴 수 있으며, PHP에서는 PHP 자체 그리기 기능을 사용하여 간단한 인증 코드를 그릴 수 있으며, PHP의 그리기를 사용하여 사진에 워터마크를 추가할 수도 있습니다. ...

PHP 도면 좌표계

수학을 배울 때 좌표계를 배워야 합니다. 여기서는 좌표계도 프로그래밍 언어에 존재합니다. 하지만 프로그래밍 언어의 좌표계는 수학의 좌표계와 다릅니다.

PHP 좌표계에서 좌표 원점은 왼쪽 상단에 위치합니다
, X축은 가로 방향, Y축은 현재 위치의 세로 방향, 좌표계의 단위는 픽셀입니다.
PHP 기본 튜토리얼 16: 그래픽 그리기에 GD 라이브러리 사용

픽셀

위에서 언급한 것처럼 좌표계의 좌표점은 픽셀입니다. 사용자의 화면 관계와 동일합니다.

픽셀: 컴퓨터가 화면에 표시하는 콘텐츠는 화면의 각 픽셀로 구성됩니다. 예를 들어 컴퓨터 모니터의 해상도는 800×600입니다. 즉, 컴퓨터 화면의 각 라인은 800개의 점으로 구성되어 있으며 600개의 선으로 구성되어 있으며 전체 컴퓨터 화면은 총 480,000개의 픽셀을 가지고 있습니다.

참고: 픽셀은 밀도의 단위이고 센티미터는 길이의 단위입니다.

PHP 그리기

PHP에서 그리기 기술을 사용하려면 gd2 확장 라이브러리를 열어야 합니다. PHP.ini 파일에서 열고, 연 후 서버를 다시 시작하세요.

PHP 기본 튜토리얼 16: 그래픽 그리기에 GD 라이브러리 사용

PHP 그리기 기능의 모든 기능은 이미지로 시작됩니다. 그리고 전체 함수는 소문자입니다 . 도움말 문서에는 많은 기능이 있습니다. 필요할 때 함수 참조-이미지 생성 및 처리-GD-GD 및 이미지 처리 함수에서 찾을 수 있습니다. PHP 그리기를 수행할 때 일반적으로 다음 단계에 따라 단계별로 완료할 수 있습니다.

그림 그리기 단계

  1. 그림을 그릴 수 있는 캔버스에 해당하는 이미지 리소스 생성(종이에 해당) , 캔버스를 만드는 방법 중 하나:

    $canva = imagecreatetruecolor(宽,高)
  2. 브러시를 생성하고, 브러시를 사용하여 캔버스에 칠하고, 브러시 색상은 RGB로 구성할 수 있습니다. 메서드의 매개 변수는 0~255의 정수 또는 16진수 0x00~0xFF입니다.

    $paint = imagecolorallocate(画布,三原色(r,g,b));
  3. 그래픽을 그립니다. 여기서는 직선만 그립니다. 다른 이미지도 그릴 수 있습니다.

    imageline(画布,startX,startY,endX,endY,画笔);
  4. 도안이 완성되어 웹페이지로 출력 가능합니다. 특정 디렉토리에 저장할 수도 있습니다.

  5. 적시에 도면 리소스를 파괴하고 메모리를 해제합니다.

    imagedestroy(画布);

위 단계에 따라 다양한 그래픽을 그릴 수 있습니다. 그래픽을 그릴 때 다양한 작업을 수행하여 그래픽을 연결할 수 있으며, 다양한 색상으로 페인팅하기 위해 다양한 브러시를 만들 수도 있습니다.

다양한 그래픽 그리기

위 단계에 따라 다양한 패턴을 그릴 수 있습니다. 다른 그래픽을 그리려면 다른 기능이 필요합니다. 함수의 매개변수는 도움말 문서에서 쿼리할 수 있습니다.

<?php

    //创建一个画布
    $canvas = imagecreatetruecolor(300, 300);
    //创建一个画笔
    $paint = imagecolorallocate($canvas, 255, 0, 0);

    //绘制不同的图形,可以修改函数进行不同图形的绘制
    //绘制一条直线
    imageline($canvas, 10, 10, 50, 50, $paint);
    //绘制一个矩形
    imagerectangle($canvas, 10, 100, 30, 120, $paint);

    //绘制一个椭圆
    imageellipse($canvas, 100, 121, 100, 50, $paint);
    //绘制一个圆,也是上面的函数,不过是把宽和高写成一样的就行了。
    imageellipse($canvas,200,100,50,50,$paint);
    //绘制弧形
    imagearc($canvas, 200,50,40, 40, 0, 90, $paint);
    //画一个填充的圆形
    imagefilledellipse($canvas, 250, 230, 60, 60, $paint);
    //输出到浏览器
    header("content-type:image/png");
    //以png的形式输出到浏览器上
    imagepng($canvas);

    //销毁图形,释放内存
    imagedestroy($canvas);

PHP 기본 튜토리얼 16: 그래픽 그리기에 GD 라이브러리 사용
위 코드는 다양한 함수를 사용하여 다양한 그래픽을 생성하지만 위 코드에서는 이미지를 채우는 데 하나만 사용됩니다. 예를 들어 원을 그리고 색상으로 채웁니다. . imagefilledellipse() 함수를 사용할 수 있습니다. 이 함수에는 imageellipse() 함수보다 채워진 함수가 하나 더 있고 내부 매개변수는 여전히 동일합니다. 그래픽을 그릴 때 그래픽을 채우려면 일반적으로 이미지 뒤에 채워진 문자를 추가하면 됩니다.

PHP에서는 미리 만들어진 그림을 사용하여 그래픽을 그릴 수도 있습니다. 이 방법을 사용하는 것은 캔버스에 처음부터 패턴이 있고 패턴 위에 그림을 그리는 것으로 이해될 수 있습니다.

<?php
    //使用现有的图形进行绘制
    $canvas = imagecreatefromjpeg(&#39;Desert.jpg&#39;);
    //创建画笔
    $paint_red = imagecolorallocate($canvas,255,0,0);
    //在创建一个蓝色的笔。
    $paint_blue = imagecolorallocate($canvas,0,0,255);
    //绘制一个填充的弧形,最后一个参数是连接的样式。
    imagefilledarc($canvas, 100, 100, 100, 100, 0, 180, $paint_blue,IMG_ARC_PIE 
);  


    //输出到浏览器
    header("content-type:image/png");
    //以png的形式输出到浏览器上
    imagepng($canvas);

    //销毁图形,释放内存
    imagedestroy($canvas);

PHP 기본 튜토리얼 16: 그래픽 그리기에 GD 라이브러리 사용
결과를 보면 도형의 왼쪽 상단에 채워진 반원이 그려져 있는 것을 볼 수 있습니다.

물론 원본 그래픽을 수정하고 싶지 않다면 복사 방법을 사용하여 기존 그래픽을 복사할 수 있습니다. 이러한 방식으로 그래픽을 수정하면 원본 그래픽이 반영되지 않습니다.

<?php
    //创建一个空白的画布
    $canvas = imagecreatetruecolor(500,500);
    //创建一个图片
    $image = imagecreatefromjpeg(&#39;Desert.jpg&#39;);
    //使用函数获取图片的信息,里面包括了图片的宽高。
    $image_info = getimagesize(&#39;Desert.jpg&#39;);
    //使用imagecopy()方法进行拷贝
    //第一个参数是把图形拷贝到那个画布,第二个参数是从哪里拷贝,第三,四个参数是拷贝到的画布从哪里开始,第五六七八个参数是被拷贝的图形从哪里开始,宽和高是多少
    imagecopy($canvas, $image, 0, 0, 0, 0, $image_info[0], $image_info[1]);

    //在拷贝的图形上绘制一个填充的矩形。

    $paint = imagecolorallocate($canvas,0,255,0);
    imagefilledrectangle($canvas, 100, 100, 300, 300, $paint);
    //输出到浏览器
    header("content-type:image/png");
    //以png的形式输出到浏览器上
    imagepng($canvas);

    //销毁图形,释放内存
    imagedestroy($canvas);

PHP 기본 튜토리얼 16: 그래픽 그리기에 GD 라이브러리 사용
위의 작업은 imagecopy() 함수를 사용하여 수행됩니다. 이 함수를 사용할 때 내부 매개변수에 주의해야 합니다.

在开发中我们会遇到在一张图片上打印上水印。这里我们有两个函数都可以进行imagestring()函数和imagettftext()函数,但是这两个函数是有不同的,imagestring()函数不支持中文,并且它支持的字体太少,只有五种字体,imagettftext()函数可以很好的输出中文,并且它的字体可以自由的设置,但是这个函数需要一个字体文件。

<?php

    //创建一个空白的画布
    $canvas = imagecreatetruecolor(500,500);
    //创建一个图片
    $image = imagecreatefromjpeg(&#39;Desert.jpg&#39;);
    //使用函数获取图片的信息,里面包括了图片的宽高。
    $image_info = getimagesize(&#39;Desert.jpg&#39;);
    //使用imagecopy()方法进行拷贝
    imagecopy($canvas, $image, 0, 0, 0, 0, $image_info[0], $image_info[1]);
    //绘制水印的
    $paint = imagecolorallocate($canvas, 255, 0, 0);
    //使用imagestring()函数
    $str = &#39;lijiafei&#39;;
    //这个函数第二个参数是设置字体的,只能是1-5,
    imagestring($canvas, 5, 100, 300, $str, $paint);

    //使用imagettftext()函数
    $text = &#39;这是一张中文的水印&#39;;
    imagettftext($canvas, 30, 0, 100, 200, $paint, &#39;STXINGKA.TTF&#39;, $text);

    header("content-type:image/png");
    //以png的形式输出到浏览器上
    imagepng($canvas);

    //销毁图形,释放内存
    imagedestroy($canvas);

PHP 기본 튜토리얼 16: 그래픽 그리기에 GD 라이브러리 사용

在上面的代码中我们可以看到使用两个函数进行水印的打印。

  • imagestring(resource $image , int $font , int $x , int $y , string $s , int $col )  

  1. 第一个参数可以理解为是一个画布,

  2. 第二个参数是水印的字体大小,这里只支持1-5五种字体。

  3. 第三、四个参数是水印位于图片的那个位置,坐标位于字体的左上角。

  4. 第五个参数是需要打印的字体。

  5. 第六个参数字体的颜色。

  • imagettftext(resource $image,float $size,float $angle,int $x,int $y,int $color,string $fontfile,string $text)这个函数的参数有点多,但是也不难理解。

    1. 第一个参数是一个画布

    2. 第二个参数是字体的大小,这里的字体的大小我们可以自由的设置,数字越大,字体越大。

    3. 第三个参数是字体倾斜的度数,按照逆时针的顺序进行倾斜。

    4. 第四、五个参数是字体位于图片的位置,这里的坐标是从字体的左下角计算的,和上面的不同。

    5. 第六个参数是字体的颜色。

    6. 第七个参数是一个字体文件的名字,在我们的C:\Windows\Fonts下有很多字体,我们可以选择一种字体,字体文件我们需要粘贴到当前文件下面才能生效。

    7. 第八个参数是需要打印的字。

    绘图案例

    上面我们介绍了大多数函数的介绍,这里我们做一个案列,这个案例说白了就是利用不同的函数进行拼接图形。

    PHP 기본 튜토리얼 16: 그래픽 그리기에 GD 라이브러리 사용

    代码:

    <?php
        //创建一个画布
        $canvas = imagecreatetruecolor(500, 500);
        //蓝色的笔
        $blue = imagecolorallocate($canvas, 0, 0, 255);
        //白的的笔
        $white = imagecolorallocate($canvas,255,255,255);
        //黑色的笔
        $black = imagecolorallocate($canvas,0,0,0);
        //红色的笔
        $red = imagecolorallocate($canvas,255,0,0);
        //画头,画一个填充颜色是蓝色的圆。
        imagefilledellipse($canvas, 150, 150, 130, 105, $blue);
        //画脸,画一个填充颜色是白色的圆。但是圆的原点比头的原点要往下一点。
        imagefilledellipse($canvas, 150, 160, 110, 90, $white);
        //画两个眼睛
        imageellipse($canvas, 140, 130, 20, 30, $black);
        imageellipse($canvas, 160, 130, 20, 30, $black);
        //画两个眼珠
        imagefilledellipse($canvas, 140, 130, 5, 5, $black);
        imagefilledellipse($canvas, 160, 130, 5, 5, $black);
        //画鼻子
        imagefilledellipse($canvas, 150, 150, 10, 10, $red);
        //画鼻子下面的一条线
        imageline($canvas,150,155,150,165,$black);
        //画嘴
        imagefilledarc($canvas, 150,165, 75, 60, 0, 180, $red,IMG_ARC_PIE);
        //画嘴的两个角
        imagearc($canvas, 114,156, 20, 20, 90, 270, $black);
        imageline($canvas,114,165,187,165,$black);
        imagearc($canvas, 187,156, 20, 20, 270, 90, $black);
        //把嘴巴画成黑色
        imagearc($canvas, 150,165, 75, 60, 0, 180, $black);
    
    
        header("content-type:image/png");
    
        imagepng($canvas);
        imagedestroy($canvas);

    利用绘图制作验证码

    我们在开头提到过,我们可以利用绘图技术来进行网站验证码的制作,而验证码的生成可以看成在一张图片上把随机产生的字体打印在图片上。同时在图片上有一些点进行视线的骚扰,这里我们可以创建一个类,然后通过不同的方法进行不同的操作。

    1. 创建一个方法进行随机数的生成。

      /*
      生成随机码
       */
      private function mkCode(){
          //通过类的参数获取需要的随机数的个数。这个值可以自由的指定
          $len = $this -> _len;
          //我们生成的随机数的字母喝数字就是在这里面进行随机生成。
          $str = &#39;ABCDEFGHIGKLMNOPQRST1234567890&#39;;
          $code = &#39;&#39;;
          //通过循环的生成随机数进行获取
          for($i = 0; $i < $len; $i++){
              //生成随机数
              $j = mt_rand(0,strlen($str)-1);
              //把随机生成的随机数拼接起来。
              $code .= $str[$j];
          }
          //把生成的随机数,保存在session中,便于当我们输入验证码是验证是否正确。
          @session_start();
          $_SESSION[&#39;code&#39;] = $code;
          return $code;
      }

      我们在生成随机码的时候,可以指定生成的随机数的长度,默认是4个。通过mt_rand(参数1,参数2)函数生成不同的数字。这个函数返回一个参数1和参数2之间(包括这两个数)的int类型的数字。

    2. 上面我们已经生成一个随机的验证码。那么接下来就可以把随机生成的随机数打印到一个画布上。

      //生成验证码
          public function makeImage(){
              //获取随机生成的随机码
              $code = $this -> mkCode();
              //通过类的属性指定图形的大小,默认是100,20
              $canvas = imagecreatetruecolor($this -> _width, $this -> _height);
              //随机生成一个颜色的画笔
              $paint = imagecolorallocate($canvas,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
              //把背景的颜色进行改变,默认是黑色的。
              imagefill($canvas, 10, 10, $paint);
              //创建一个画随机码的笔,颜色也是随机生成的。
              $paint_str = imagecolorallocate($canvas,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
              //把随机码打印在画布上。
              imagestring($canvas, 4, 20, 2, $code, $paint_str);
              //绘制干扰点的颜色
              $paint_pixel = imagecolorallocate($canvas,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
              //通过类的属性指定需要多少个干扰点。
              for($i = 0; $i < $this -> _pixel; $i++){
                  //绘制不同的干扰点,而绘制的位置也是随机生成的。
                  imagesetpixel($canvas, mt_rand(0,imagesx($canvas)),  mt_rand(0,imagesy($canvas)), $paint_pixel);
              }
              header("content-type:image/png");
              imagepng($canvas);
              imagedestroy($canvas);
          }
      1. 先通过本类的方法获取一个随机生成的随机数。

      2. 把画布的背景进行不同颜色的转变

      3. 把随机码绘制在画布上。

      4. 通过循环绘制不同的干扰点。

    源代码:

    <?php
    
        Class Cap{
            //生成的字符的长度
            private $_len = 4;
            //干扰点的个数
            private $_pixel = 100;
    
            private $_width = 100;
            private $_height = 20;
    
            public function __set($pro,$val){
                if(property_exists($this, $pro)){
                    $this -> $pro = $val;
                }
            }
    
            /*
            生成随机码
             */
            private function mkCode(){
                //通过类的参数获取需要的随机数的个数。这个值可以自由的指定
                $len = $this -> _len;
                //我们生成的随机数的字母喝数字就是在这里面进行随机生成。
                $str = &#39;ABCDEFGHIGKLMNOPQRST1234567890&#39;;
                $code = &#39;&#39;;
                //通过循环的生成随机数进行获取
                for($i = 0; $i < $len; $i++){
                    //生成随机数
                    $j = mt_rand(0,strlen($str)-1);
                    //把随机生成的随机数拼接起来。
                    $code .= $str[$j];
                }
                //把生成的随机数,保存在session中,便于当我们输入验证码是验证是否正确。
                @session_start();
                $_SESSION[&#39;code&#39;] = $code;
                return $code;
            }
            //生成验证码
            public function makeImage(){
                //获取随机生成的随机码
                $code = $this -> mkCode();
                //通过类的属性指定图形的大小,默认是100,20
                $canvas = imagecreatetruecolor($this -> _width, $this -> _height);
                //随机生成一个颜色的画笔
                $paint = imagecolorallocate($canvas,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
                //把背景的颜色进行改变,默认是黑色的。
                imagefill($canvas, 10, 10, $paint);
                //创建一个画随机码的笔,颜色也是随机生成的。
                $paint_str = imagecolorallocate($canvas,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
                //把随机码打印在画布上。
                imagestring($canvas, 4, 20, 2, $code, $paint_str);
                //绘制干扰点的颜色
                $paint_pixel = imagecolorallocate($canvas,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
                //通过类的属性指定需要多少个干扰点。
                for($i = 0; $i < $this -> _pixel; $i++){
                    //绘制不同的干扰点,而绘制的位置也是随机生成的。
                    imagesetpixel($canvas, mt_rand(0,imagesx($canvas)),  mt_rand(0,imagesy($canvas)), $paint_pixel);
                }
                header("content-type:image/png");
                imagepng($canvas);
                imagedestroy($canvas);
            }
    
            //判断验证码和填写的验证码是否正确
            public function checkCode($code){
                @session_start();
                if(strtolower($code) === strtolower($_SESSION[&#39;code&#39;])){
                    return true;
                }
                return false;
            }
        }
        $cap = new Cap();
        $cap -> makeImage();

    运行代码,每次刷新都可以生成一个不同的验证码。

    PHP 기본 튜토리얼 16: 그래픽 그리기에 GD 라이브러리 사용

    总结

    PHP的图形绘制,简单的可以理解为不同的函数的利用。上面的案列几乎都是函数的利用。同时也要理解绘制图形的步骤,在绘制图形时,注意坐标是那几个参数。

     以上就是PHP基础教程十六之使用GD库进行图形绘制的内容,更多相关内容请关注PHP中文网(www.php.cn)!


    성명:
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.