Maison  >  Article  >  développement back-end  >  Tutoriel de base PHP 16 : Utilisation de la bibliothèque GD pour le dessin graphique

Tutoriel de base PHP 16 : Utilisation de la bibliothèque GD pour le dessin graphique

黄舟
黄舟original
2017-03-01 10:24:266662parcourir

Avant-propos

Lorsque nous allons en ligne pour nous connecter à une page Web, la plupart d'entre nous doivent saisir un code de vérification pour vérification avant de pouvoir nous connecter. , et les programmeurs PHP peuvent dessiner eux-mêmes des codes de vérification en fonction de la situation. En PHP, nous pouvons utiliser la propre fonction de dessin de PHP pour dessiner des codes de vérification simples, et nous pouvons également utiliser le dessin de PHP pour ajouter des filigranes aux images. ...

Système de coordonnées de dessin PHP

Quand on apprend les mathématiques, il faut apprendre le système de coordonnées. Je ne l'expliquerai pas ici aussi. Les systèmes de coordonnées existent également en programmation. langages. Mais le système de coordonnées des langages de programmation est différent du système de coordonnées des mathématiques.

Dans le système de coordonnées PHP, l'origine des coordonnées est située dans le coin supérieur gauche
, l'axe X est la direction horizontale, l'axe Y est la direction verticale de la position actuelle et le l'unité du système de coordonnées est le pixel.
Tutoriel de base PHP 16 : Utilisation de la bibliothèque GD pour le dessin graphique

Pixel

Comme mentionné ci-dessus, le point de coordonnées du système de coordonnées est un pixel. Un pixel est une unité de densité. est la même que la relation de l'écran de l'utilisateur.

Pixels : Le contenu affiché par l'ordinateur sur l'écran est composé de chaque pixel de l'écran. Par exemple, la résolution de l'écran de l'ordinateur est de 800 × 600, ce qui signifie que chaque ligne de l'écran de l'ordinateur est. composé de 800 points Composé de 600 lignes, l'écran entier de l'ordinateur compte au total 480 000 pixels.

Remarque : le pixel est l'unité de densité et le centimètre est l'unité de longueur.

Dessin PHP

Si vous souhaitez utiliser la technologie de dessin en PHP, vous devez ouvrir la bibliothèque d'extension gd2. Ouvrez-le dans le fichier PHP.ini et redémarrez le serveur après l'avoir ouvert.

Tutoriel de base PHP 16 : Utilisation de la bibliothèque GD pour le dessin graphique

Les fonctions de la fonction de dessin PHP commencent toutes par image. Et toute la fonction est en minuscules . Il existe de nombreuses fonctions dans la documentation d'aide. Lorsque nous en avons besoin, nous pouvons le trouver dans : Fonction Référence-Génération et traitement d'images-GD-GD et Fonctions de traitement d'images. Lorsque nous faisons du dessin PHP, nous pouvons généralement suivre les étapes pour le réaliser étape par étape.

Étapes du dessin

  1. Créer une ressource image, équivalente à une toile, sur laquelle on peut dessiner (équivalent à un morceau de papier) , une des façons de créer une toile :

    $canva = imagecreatetruecolor(宽,高)
  2. Créez un pinceau, utilisez le pinceau pour peindre sur la toile, et la couleur du pinceau peut être configurée avec RVB. Les paramètres de la méthode sont des entiers de 0 à 255 ou hexadécimaux de 0x00 à 0xFF.

    $paint = imagecolorallocate(画布,三原色(r,g,b));
  3. Dessinez des graphiques, ici nous traçons simplement une ligne droite, vous pouvez également dessiner n'importe quelle autre image.

    imageline(画布,startX,startY,endX,endY,画笔);
  4. Le dessin est terminé et peut être affiché sur la page Web. Il peut également être enregistré dans un certain répertoire.

  5. Détruisez les ressources de dessin et libérez de la mémoire en temps opportun.

    imagedestroy(画布);

Nous pouvons suivre les étapes ci-dessus pour dessiner différents graphiques, nous pouvons effectuer différentes opérations pour assembler des graphiques en même temps, nous pouvons également créer différents pinceaux. dessiner différentes couleurs.

Dessinez différents graphiques

Nous pouvons dessiner différents motifs selon les étapes ci-dessus. C'est juste que différentes fonctions sont nécessaires pour dessiner différents graphiques. Les paramètres de la fonction peuvent être interrogés dans le document d'aide.

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

Tutoriel de base PHP 16 : Utilisation de la bibliothèque GD pour le dessin graphique
Le code ci-dessus utilise différentes fonctions pour créer différents graphiques, mais nous n'en avons qu'une dans le code ci-dessus pour remplir l'image. Par exemple, nous dessinons un cercle et le remplissons. avec de la couleur. Vous pouvez utiliser la fonction imagefilledellipse(). Cette fonction a juste un rempli de plus que la fonction imageellipse(), et les paramètres à l'intérieur sont toujours les mêmes. Lorsque vous dessinez des graphiques, si vous souhaitez remplir les graphiques, il vous suffit généralement d'ajouter la lettre remplie après l'image.

PHP peut également utiliser des images prêtes à l'emploi pour dessiner des graphiques. L'utilisation de cette méthode peut être comprise comme si le canevas avait un motif dès le début, et nous dessinons simplement sur le motif.

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

Tutoriel de base PHP 16 : Utilisation de la bibliothèque GD pour le dessin graphique
Vous pouvez voir d'après le résultat qu'un demi-cercle rempli est dessiné dans le coin supérieur gauche du graphique.

Bien sûr, si nous ne voulons pas modifier les graphiques originaux, nous pouvons utiliser la méthode de copie pour copier les graphiques existants. De cette façon, vos modifications graphiques ne refléteront pas les graphiques originaux.

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

Tutoriel de base PHP 16 : Utilisation de la bibliothèque GD pour le dessin graphique
Ce qui précède est effectué à l'aide de la fonction imagecopy(). Nous devons faire attention aux paramètres à l'intérieur lors de l'utilisation de cette fonction.

在开发中我们会遇到在一张图片上打印上水印。这里我们有两个函数都可以进行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);

Tutoriel de base PHP 16 : Utilisation de la bibliothèque GD pour le dessin graphique

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

  • 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. 第八个参数是需要打印的字。

    绘图案例

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

    Tutoriel de base PHP 16 : Utilisation de la bibliothèque GD pour le dessin graphique

    代码:

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

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

    Tutoriel de base PHP 16 : Utilisation de la bibliothèque GD pour le dessin graphique

    总结

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

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


    Déclaration:
    Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn