PHP基礎教程十六之使用GD庫進行圖形繪製

來源:互聯網
上載者:User

前言

我們在上網登入網頁的時候,絕大多數都要輸入驗證碼,進行驗證,才能登入,而PHP程式員可以根據情況自己繪製驗證碼,在PHP中,簡單的驗證碼,我們可以使用PHP內建的繪圖功能來繪製,並且我們也可以使用PHP的繪圖對圖片進行浮水印的增加……

PHP繪圖座標系

我們學數學的時候都要學習座標系,這裡就不在進行闡述,在程式設計語言中也是有座標系的存在,但是程式設計語言的座標系和數學上的座標系是不一樣的。

在PHP座標系中,座標原點位於左上方
,X軸為水平方向,Y軸是當前位置的垂直方向,同時座標系的單位是像素。

像素

上面說到座標系的座標點是像素,像素是一個密度單位,它的大小和使用者的螢幕有關係。

像素:電腦在螢幕上顯示的內容都是由螢幕上的每一個像素組成的,例如,電腦顯示器的解析度是800×600,表示電腦螢幕上的每一行由800個點組成,共有600行,整個電腦螢幕共有480000個像素。

注意:像素是密度單位,厘米是長度單位。

PHP繪圖

在PHP中如果要使用繪圖技術,必須開啟gd2擴充庫。在PHP.ini檔案中進行開啟,開啟後重啟伺服器。

在PHP繪圖功能中的函數都是以image開頭的。並且整個函數都是小寫。在協助文檔中有很多函數。在我們需要的時候可以在裡面找:函數參考-映像產生和處理-GD-GD和影像處理函數。我們在進行PHP繪圖中,一般可以按照步驟一步步完成。

繪圖的步驟

  1. 建立一個映像資源,相當於一個畫布,我們可以在這個畫布上繪畫(相當於一張紙),建立畫布方式中的一種:

    $canva = imagecreatetruecolor(寬,高)
  2. 建立一個畫筆,使用畫筆在畫布上繪畫,而畫筆的顏色可以用RGB進行配置。方法裡面的參數是 0 到 255 的整數或者十六進位的 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);


上面的代碼使用不同的函數建立不同的圖形,但是我們在上面的代碼中只有一個對映像進行填充,比如我們畫一個圓裡面填充上顏色。可以使用imagefilledellipse()函數,這個函數只是比imageellipse()函數多了一個filled,裡面的參數還是一樣的。在繪製圖形中,如果要填充圖形,一般是在image後面添加filled這個字母就可以了。

PHP繪製圖形是還可以使用現成的圖片進行繪製,使用這種方式可以理解為畫布開始就有圖案了,我們只是在圖案上進行繪製。

<?php    //使用現有的圖形進行繪製    $canvas = imagecreatefromjpeg('Desert.jpg');    //建立畫筆    $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);


從結果中可以看到在圖形的左上方畫了一個填充的半圓形。

當然,如果我們不想修改原來的圖形,可以使用copy方法把現有的圖形複製下來。這樣你對圖形的修改就不會形象到原來的圖形。

<?php    //建立一個空白的畫布    $canvas = imagecreatetruecolor(500,500);    //建立一個圖片    $image = imagecreatefromjpeg('Desert.jpg');    //使用函數擷取圖片的資訊,裡麵包括了圖片的寬高。    $image_info = getimagesize('Desert.jpg');    //使用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);


上面使用imagecopy()函數進行,我們在使用這個函數的時候需要注意裡面的參數。

在開發中我們會遇到在一張圖片上列印上浮水印。這裡我們有兩個函數都可以進行imagestring()函數和imagettftext()函數,但是這兩個函數是有不同的,imagestring()函數不支援中文,並且它支援的字型太少,只有五種字型,imagettftext()函數可以很好的輸出中文,並且它的字型可以自由的設定,但是這個函數需要一個字型檔。

<?php    //建立一個空白的畫布    $canvas = imagecreatetruecolor(500,500);    //建立一個圖片    $image = imagecreatefromjpeg('Desert.jpg');    //使用函數擷取圖片的資訊,裡麵包括了圖片的寬高。    $image_info = getimagesize('Desert.jpg');    //使用imagecopy()方法進行拷貝    imagecopy($canvas, $image, 0, 0, 0, 0, $image_info[0], $image_info[1]);    //繪製浮水印的    $paint = imagecolorallocate($canvas, 255, 0, 0);    //使用imagestring()函數    $str = 'lijiafei';    //這個函數第二個參數是設定字型的,只能是1-5,    imagestring($canvas, 5, 100, 300, $str, $paint);    //使用imagettftext()函數    $text = '這是一張中文的浮水印';    imagettftext($canvas, 30, 0, 100, 200, $paint, 'STXINGKA.TTF', $text);    header("content-type:image/png");    //以png的形式輸出到瀏覽器上    imagepng($canvas);    //銷毀圖形,釋放記憶體    imagedestroy($canvas);

在上面的代碼中我們可以看到使用兩個函數進行浮水印的列印。

  • 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    //建立一個畫布    $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 = 'ABCDEFGHIGKLMNOPQRST1234567890';    $code = '';    //通過迴圈的產生隨機數進行擷取    for($i = 0; $i < $len; $i++){        //產生隨機數        $j = mt_rand(0,strlen($str)-1);        //把隨機產生的隨機數拼接起來。        $code .= $str[$j];    }    //把產生的隨機數,儲存在session中,便於當我們輸入驗證碼是驗證是否正確。    @session_start();    $_SESSION['code'] = $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 = 'ABCDEFGHIGKLMNOPQRST1234567890';            $code = '';            //通過迴圈的產生隨機數進行擷取            for($i = 0; $i < $len; $i++){                //產生隨機數                $j = mt_rand(0,strlen($str)-1);                //把隨機產生的隨機數拼接起來。                $code .= $str[$j];            }            //把產生的隨機數,儲存在session中,便於當我們輸入驗證碼是驗證是否正確。            @session_start();            $_SESSION['code'] = $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['code'])){                return true;            }            return false;        }    }    $cap = new Cap();    $cap -> makeImage();

運行代碼,每次重新整理都可以產生一個不同的驗證碼。

總結

PHP的圖形繪製,簡單的可以理解為不同的函數的利用。上面的案列幾乎都是函數的利用。同時也要理解繪製圖形的步驟,在繪製圖形時,注意座標是那幾個參數。

以上就是PHP基礎教程十六之使用GD庫進行圖形繪製的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.