ホームページ >バックエンド開発 >PHPチュートリアル >PHP 基本チュートリアル 16: グラフィック描画に GD ライブラリを使用する

PHP 基本チュートリアル 16: グラフィック描画に GD ライブラリを使用する

黄舟
黄舟オリジナル
2017-03-01 10:24:266708ブラウズ

前書き

オンラインで Web ページにログインするとき、ほとんどの人はログインする前に確認のための確認コードを入力する必要があります。ただし、PHP プログラマーは、 PHP では、これは簡単です。PHP 独自の描画関数を使用して検証コードを描画することも、PHP の描画を使用して画像にウォーターマークを追加することもできます...

PHP 描画座標系

数学を学ぶときに学びましょう 座標系についてはここでは説明しませんが、プログラミング言語にも座標系は存在しますが、プログラミング言語の座標系は数学の座標系とは異なります。

PHP座標系では、座標原点は左上隅
にあり、X軸は現在位置の水平方向、Y軸は垂直方向であり、座標系の単位はピクセル。
PHP 基本チュートリアル 16: グラフィック描画に GD ライブラリを使用する

ピクセル

前述したように、座標系の座標点はピクセルであり、ピクセルは密度の単位であり、そのサイズはユーザーの画面に関連します。

ピクセル: コンピューターによって画面上に表示されるコンテンツは、画面上の各ピクセルで構成されます。たとえば、コンピューターのモニターの解像度は 800×600 であり、コンピューター画面上の各行は 800 個のドットで構成されます。 、合計 600 OK、コンピューター画面全体のピクセル数は 480,000 です。

注: ピクセルは密度の単位で、センチメートルは長さの単位です。

PHP 描画

PHP で描画テクノロジを使用したい場合は、gd2 拡張ライブラリを開く必要があります。 PHP.ini ファイルで開き、開いた後にサーバーを再起動します。

PHP 基本チュートリアル 16: グラフィック描画に GD ライブラリを使用する

PHPの描画関数の関数はすべて画像から始まります。そして、関数全体は小文字です。ヘルプドキュメントには多くの機能が記載されています。必要な場合は、関数リファレンス - 画像の生成と処理 - GD - GD および画像処理関数で見つけることができます。 PHP 描画を行うときは、通常、次の手順に従って段階的に描画を完了できます。

描画の手順

  1. キャンバスを作成する方法の 1 つとして、キャンバス (紙に相当) に相当する画像リソースを作成します。

  2. 作成 キャンバス上にペイントするためにブラシを使用し、ブラシの色をRGBで設定できます。メソッドのパラメータは、0 ~ 255 の整数または 16 進数の 0x00 ~ 0xFF です。
  3. $canva = imagecreatetruecolor(宽,高)

  4. グラフィックを描画します。ここでは直線を描画するだけですが、他の画像を描画することもできます。
  5. $paint = imagecolorallocate(画布,三原色(r,g,b));

  6. 描画が完成し、Webページに出力できるようになりました。特定のディレクトリに保存することもできます。
  7. 描画リソースを破棄し、適時にメモリを解放します。
  8. imageline(画布,startX,startY,endX,endY,画笔);

  9. 上記の手順に従って、さまざまなグラフィックスを描画することができます。同時に、さまざまな操作を実行して、さまざまな色を描画することもできます。

さまざまなグラフィックを描画します

上記の手順に従って、さまざまなパターンを描画できます。異なるグラフィックスを描画するには異なる関数が必要になるだけです。関数のパラメータはヘルプドキュメントで問い合わせることができます。

imagedestroy(画布);

上記のコードでは、さまざまなグラフィックスを作成するためにさまざまな関数が使用されていますが、たとえば、画像を塗りつぶす関数は 1 つだけです。 imagefilledellipse() 関数を使用できます。この関数には imageellipse() 関数よりも PHP 基本チュートリアル 16: グラフィック描画に GD ライブラリを使用するfilled
が 1 つ多いだけで、内部のパラメータは同じです。グラフィックを描画するときに、グラフィックを塗りつぶしたい場合は、通常、画像の後に塗りつぶされた文字を追加するだけです。 PHP では、既成の画像を使用してグラフィックを描画することもできます。このように、キャンバスには最初からパターンがあり、そのパターンに描画するだけです。

<?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 ライブラリを使用する
もちろん、元のグラフィックを変更したくない場合は、copy メソッドを使用して既存のグラフィックをコピーできます。この方法では、グラフィックスに加えた変更は元のグラフィックスを反映しません。

<?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);

上記は、imagecopy() 関数を使用して行われます。この関数を使用するときは、内部のパラメーターに注意する必要があります。 PHP 基本チュートリアル 16: グラフィック描画に GD ライブラリを使用する

在开发中我们会遇到在一张图片上打印上水印。这里我们有两个函数都可以进行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 までご連絡ください。