PHP中GD庫的使用


1、生成帶有文字的普通圖片

// 1、新建空白畫布 創建一個真顏色(黑白)的圖片
$width = $height = 200;
$img = imagecreatetruecolor($width, $height);
//2、選擇一個顏色用於背景
$red = $green = $blue = 244;
$bgc = imagecolorallocate($img, $red, $green, $blue);
//3、將背景顏色填充到畫布中,在(0,0)左上角填充
$x = $y = 0;
imagefill($img, $x, $y, $blue);
//4、選擇一個顏色用於字符
$cred = $cgreen = $cblue = 7;
$color = imagecolorallocate($img, $cred, $cgreen, $cblue);
//5、選擇一個字符串在畫布的(0,0)左上角進行繪制顏色為color
$cx = $cy = 0;
$font = 5;//值為1-5
$str = 'hello';//只能輸入英文
imagestring($img, $font, $cx, $cy, $str, $color);
//6、把生成好的圖片保存
imagepng($img,'image/1.png');
//7、關閉畫布
imagedestroy($img);
imagefill():將圖片填充到畫布中的操作類似於在畫圖工具中使用填充工具將顏色塗滿畫布,在哪里'點擊'都可以,只不過在畫布左上角(0,0)上填充最方便。
代碼中所有有關顏色的參數都類似於Css中的rgb()屬性,其屬性值為0~255

結果如下:

 

 

 2、生成復雜驗證碼圖片(有線條和雜點)

//1、建立畫布
$img = imagecreatetruecolor('200', '80');
//2、生成並填充背景色
$bgc = imagecolorallocate($img, 220, 220, 200);
imagefill($img, 0, 0, $bgc);
//3、用隨機的顏色在隨機的位置生成20條線段
for ($i = 0; $i < 20; $i++) {
    $x1 = mt_rand(0, 200);
    $y1 = mt_rand(0, 80);
    $x2 = mt_rand(0, 200);
    $y2 = mt_rand(0, 80);
    $red = mt_rand(0, 255);
    $green = mt_rand(0, 255);
    $blue = mt_rand(0, 255);
    $color = imagecolorallocate($img, $red, $green, $blue);
    imageline($img, $x1, $y1, $x2, $y2, $color);
}
//4、用隨機的顏色在隨機的位置生成100個像素點
for ($i = 0; $i < 100; $i++) {
    $x = mt_rand(0, 200);
    $y = mt_rand(0, 80);
    $color = imagecolorallocate($img, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
    imagesetpixel($img, $x, $y, $color);//像素點小可以使用圓
}
//5、用隨機的顏色在隨機的位置生成驗證碼文字
for ($i = 0; $i < 4; $i++) {
    $size = 80/2;//單位 px 大小為高度的一半
    $angle = mt_rand(-30, 30);//水平x軸為0度
    $x = $i * 200 / 4;
    $y = 80*3/4; //文字左下角為錨點(x,y) x平分畫布的寬度,y為畫布高度的3/4,
    $color = imagecolorallocate($img, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
    $fontfile = __DIR__ . '/fonts/FZSTK.TTF';//字體文件的絕對路徑(必須),文件大於3M為中文字體文件
    $str = 'qwertyuipasdfghjklzxcvbnmQWERTYUIPASDFGHJKLZXCVBNM123456789';
    $text = $str[mt_rand(0, strlen($str))];
    imagettftext($img, $size, $angle, $x, $y, $color, $fontfile, $text);
}
//6、保存
header("content-type:image/png");//網頁內容為圖片類型
imagepng($img);//只有第一個參數,不會保存但顯示在頁面。
//7、銷毀
imagedestroy($img);
imagepng()有兩個參數,第一個參數是處理過后的圖片;第二個參數是圖片存儲的路徑和文件名(非必需),兩個參數都有即可保存圖片,而只有第一個參數,圖片不會保存,但可以立即顯示在設備上,
不過要在顯示前使用header()重新定義頁面內容為圖片格式,否則為文本格式會顯示出一堆亂碼。

結果如下:

 

 

 3、給圖片添加文字水印

<?php
//1、導入圖片,並計算寬高
$img = imagecreatefromjpeg('image/33.jpg');
$width = imagesx($img);
$height = imagesy($img);
//2,計算文本的寬高
$text = '@輕點,疼';
$fontfile = __DIR__ . '/fonts/FZSTK.TTF';//字體文件的絕對路徑(必須),文件大於3M為中文字體文件
$textinfo = imagettfbbox(20, 0, $fontfile, $text);//返回一個含有8個字段的數組,每兩個字段一組,為一個角的x,y;左下-右下-右上-左上
$twidth = $textinfo[2] - $textinfo[0];//文本寬
$theight = $textinfo[1] - $textinfo[5];//文本高
//3、將文本填充進圖片右下角
$x = $width - $twidth;
$y = $height;
$color = imagecolorallocate($img, 255, 255, 255);
imagettftext($img, 20, 0, $x, $y, $color, $fontfile, $text);
//4、查看並銷毀
header('content-type:image/jpg');
imagejpeg($img);
imagedestroy($img);
代碼中imagettfbbox()的參數分別為字體大小,角度,字體庫文件和字符內容,其中角度以水平x軸為0度,字體庫路徑必須為絕對路徑,如要使用中文,則必須導入中文字體庫(一般大於3M)。函數返回值是一個
一維數組,如下所示:

     

 

 

 

結果如下:

 

 

 4、將圖片內容設為水印添加到其它圖片

<?php
$dst_im = imagecreatefromjpeg('image/33.jpg');//背景圖片
$src_im = imagecreatefromjpeg('image/22.jpg');//要拼接圖片
$dst_x = 537;//從背景圖片dst_im的(dst_x,$dst_y)處拼接
$dst_y = 358;
$src_x = 64;//從src_im的(src_x,src_y)處獲取寬為src_w,高為src_h的圖片
$src_y = 370;
$src_w = 153;
$src_h = 148;
//沒有透明度
imagecopy($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h);
//帶有透明度
$dst_y-=200;
$pct=50;//透明度 值為1~100 對應透明~不透明
imagecopymerge($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h,$pct);
header('content-type:image/jpg');
imagejpeg($dst_im);
imagedestroy($dst_im);
imagedestroy($src_im);

結果如下:

 

 

 5、將圖片進行縮放並顯示在原圖上

<?php
$dst_im = imagecreatefromjpeg('image/33.jpg');//背景圖片
$src_im = imagecreatefromjpeg('image/22.jpg');//要拼接圖片
$dst_x = 537;//從背景圖片dst_im的(dst_x,$dst_y)處拼接
$dst_y = 358;
$src_x = 64;//從src_im的(src_x,src_y)處獲取寬為src_w,高為src_h的圖片
$src_y = 370;
$src_w = 153;
$src_h = 148;//縮放前的尺寸 $dst_w=$dst_h=50;//縮放后的尺寸 //1、imagecopyresampled 生成的圖片質量更高,處理速度更慢並且占用一定的CPU資源。
imagecopyresampled($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y,$dst_w,$dst_h, $src_w, $src_h);
//2、imagecopyresized 縮放圖像的算法比較粗糙.處理速度快,只適合不要求清晰度但需要迅速生成縮略圖的情況。
$dst_x+=100;
imagecopyresized($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y,$dst_w,$dst_h, $src_w, $src_h);
header('content-type:image/jpg');
imagejpeg($dst_im);
imagedestroy($dst_im);
imagedestroy($src_im);

結果如下:

 

 

 6、縮略圖

//1、打開原圖,獲取寬,高
$img=imagecreatefromjpeg('image/11.jpg');
$src_w=imagesx($img);
$src_h=imagesy($img);
//2、設置縮放比例,並創建空白畫布
$scale=0.1;
$dst_w=$src_w*$scale;
$dst_h=$src_h*$scale;
$dst_im=imagecreatetruecolor($dst_w,$dst_h);
//3、將原圖img的寬高縮放為(dst_w,dst_h)並放置到dst_im上。
imagecopyresampled($dst_im, $img, 0, 0, 0, 0,$dst_w,$dst_h, $src_w, $src_h);
header('content-type:image/jpeg');
imagecopyresized($dst_im, $img, 0, 0, 0, 0,$dst_w,$dst_h, $src_w, $src_h);
imagejpeg($dst_im,'image/resampled.jpg');//文件更小,更清晰
imagejpeg($dst_im,'image/resized.jpg');
imagedestroy($dst_im);
imagedestroy($img);

結果如下:

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM