如下方式是一種方法:
if(!function_exists('imagecreate')) {
die('本伺服器不支援GD模組');
}
如果不支援的話,如何配置 ? 下載gd模組的dll檔案,修改php.ini,重啟伺服器即可.
以下簡稱PHP作圖為PS.
當您打算 PS的話,應該完成如下如下步驟,這是必經的.
1:建立基本PS對象(我假設為$image),填充背景(預設黑),以後的全部ps操作都是基於這個背景映像的.
2:在$image上作圖.
3:輸出這個映像.
4:銷毀對象,清除使用記憶體.
首先,我們來認識幾個常用的函數,這些函數在php手冊裡面都有詳細介紹,此處大體引用下.
resource imagecreate ( int x_size, int y_size )
imagecreate() 返回一個映像標識符,代表了一幅大小為 x_size 和 y_size 的空白映像。
此函數基本同imagetruecolor($width,$height).
---------------------------------------------------------
int imagecolorallocate ( resource image, int red, int green, int blue )
imagecolorallocate() 返回一個標識符,代表了由給定的 RGB 成分組成的顏色。image 參數是 imagecreatetruecolor() 函數的傳回值。red,green 和 blue 分別是所需要的顏色的紅,綠,藍成分。這些參數是 0 到 255 的整數或者十六進位的 0x00 到 0xFF。imagecolorallocate() 必須被調用以建立每一種用在 image 所代表的映像中的顏色。
---------------------------------------------------------
bool imagefill ( resource image, int x, int y, int color )
imagefill() 在 image 映像的座標 x,y(映像左上方為 0, 0)處用 color 顏色執列區域填充(即與 x, y 點顏色相同且相鄰的點都會被填充)。
---------------------------------------------------------
bool imageline ( resource image, int x1, int y1, int x2, int y2, int color )
imageline() 用 color 顏色在映像 image 中從座標 x1,y1 到 x2,y2(映像左上方為 0, 0)畫一條線段。
---------------------------------------------------------
bool imagestring ( resource image, int font, int x, int y, string s, int col )
imagestring() 用 col 顏色將字串 s 畫到 image 所代表的映像的 x,y 座標處(這是字串左上方座標,整幅映像的左上方為 0,0)。如果 font 是 1,2,3,4 或 5,則使用內建字型。
---------------------------------------------------------
array imagettftext ( resource image, float size, float angle, int x, int y, int color, string fontfile, string text )
本函數比較重要,參數較多,此處不再列出,它主要是寫字到映像上,和上面的函數類似,但必前者強大.
---------------------------------------------------------
bool imagefilltoborder ( resource image, int x, int y, int border, int color )
imagefilltoborder() 從 x,y(映像左上方為 0, 0)點開始用 color 顏色執列區域填充,直到碰到顏色為 border 的邊界為止。【註:邊界內的所有顏色都會被填充。如果指定的邊界色和該點顏色相同,則沒有填充。如果映像中沒有該邊界色,則整幅映像都會被填充。】
------------------------------------------------
bool imagefilledellipse ( resource image, int cx, int cy, int w, int h, int color )
imagefilledellipse() 在 image 所代表的映像中以 cx,cy(映像左上方為 0, 0)為中心畫一個橢圓。w 和 h 分別指定了橢圓的寬和高。橢圓用 color 顏色填充。如果成功則返回 TRUE,失敗則返回 FALSE。
=================================================
輸出映像資料:imagepng($image[,$filename])
======================================================
例一:輸出藍色背景和交叉白線的圖形
<?php
$width=35;
$height=35;
//建立對象
$image=imagecreate($width,$height);
//提取顏色
$color_white=imagecolorallocate($image,255,255,255);//白色
$color_blue=imagecolorallocate($image,0,0,108);//藍色
imagefill($image,0,0,$color_blue);
//作圖
//線寬
imagesetthickness($image,3);
imageline($image,0,0,$width,$height ,$color_white);
imageline($image,$width,0,0,$height ,$color_white);
//發送對象至頭
header('content-type:image/png');
imagepng($image);
/*
//發送對象至檔案
$filename="ex1.png";
imagepng($image,$filename);
*/
//銷毀對象
imagedestroy($image);
?>
輸出映像:
線上示範:http://www.phzzy.org/temp/5do8/ex1.php
例二: 陰陽圖
<?php
$width=400;
$height=400;
$image=imagecreatetruecolor($width,$height);
//提取顏色
$color_black=imagecolorallocate($image,0,2,0);//
$color_white=imagecolorallocate($image,255,255,255);//白色
$color_blue=imagecolorallocate($image,0,0,108);//藍色
$color_red=imagecolorallocate($image,151,0,4);//紅色
$color_my=imagecolorallocate($image,192,192,255);//背景
$color_temp=imagecolorallocate($image,199,199,199);//背景
//作圖
imagefill($image,0,0,$color_white);
//第一個是大圓
imagefilledarc ($image,$width/2,$height/2,$height,$height,0,360,$color_blue,IMG_ARC_PIE);
//兩個小圓
imagefilledellipse ($image,$width/2,$height/4 ,$height/2,$height/2,$color_red);
imagefilledellipse ($image,$width/2,$height/4 * 3,$height/2,$height/2,$color_blue);
/*imagefilledellipse -- 畫一橢圓並填充*/
imagefilledarc ($image,$width/2,$height/2,$height,$height,-90,90,$color_red,IMG_ARC_PIE);
imagefilledellipse ($image,$width/2,$height/4 * 3,$height/2,$height/2,$color_blue);
//發送對象至頭
header('content-type:image/png');
imagepng($image);
/*
//發送對象至檔案
$filename="ex1.png";
imagepng($image,$filename);
*/
//銷毀對象
imagedestroy($image);
?>
示範:
http://www.phzzy.org/temp/5do8/ex2.php
例三:3D映像--cool
<?php
$width=400;
$height=400;
$image = imagecreatetruecolor($width, $height);
$white = imagecolorallocate($image, 0xFF, 0xFF, 0xFF);
$gray = imagecolorallocate($image, 0xC0, 0xC0, 0xC0);
$darkgray = imagecolorallocate($image, 0x90, 0x90, 0x90);
$navy = imagecolorallocate($image, 0x00, 0x00, 0x80);
$darknavy = imagecolorallocate($image, 0x00, 0x00, 0x50);
$red = imagecolorallocate($image, 0xFF, 0x00, 0x00);
$darkred = imagecolorallocate($image, 0x90, 0x00, 0x00);
imagefill($image,0,0,$white);
// make the 3D effect
for ($i = $height /2 +20; $i > $height /2; $i--) {
imagefilledarc($image, $width/2, $i, $width/2, $height /2, 0, 45, $darknavy, IMG_ARC_PIE);
imagefilledarc($image, $width/2, $i, $width/2, $height /2, 45, 75 , $darkgray, IMG_ARC_PIE);
imagefilledarc($image, $width/2, $i, $width/2, $height /2, 75, 360 , $darkred, IMG_ARC_PIE);
}
imagefilledarc($image, $width/2, $height /2, $width/2, $height /2, 0, 45, $navy, IMG_ARC_PIE);
imagefilledarc($image, $width/2, $height /2, $width/2, $height /2, 45, 75 , $gray, IMG_ARC_PIE);
imagefilledarc($image, $width/2, $height /2, $width/2, $height /2, 75, 360 , $red, IMG_ARC_PIE);
// flush image
header('Content-type: image/png');
imagepng($image);
imagedestroy($image);
/*
//發送對象至檔案
$filename="ex1.png";
imagepng($image,$filename);
*/
?>
輸出:
示範:http://www.phzzy.org/temp/5do8/ex3.php
例四:簡單的驗證碼
PHP建立驗證碼非常容易,容易的要死,簡單的思路是這樣的:
隨機種子產生,提取隨機字元,相連列印到圖形,輸出.,為了防止色盲,可以隨機提取顏色,也可以自訂色彩,下面看看:
<?php
session_start();
$width=65;
$height=20;
$sourcestrings="0123456789aqwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
$image=imagecreate($width,$height);
$colorarrs=array(
imagecolorallocate($image,255,255,255),//white
imagecolorallocate($image,0 ,0 , 0)//black
);
unset($sessionval);
imagesetthickness($image,3);
//隨機得到字串個數
$strsize=rand(3,5);
imagefill($image,0,0,$colorarrs[0]);
//一個個的寫字串到圖片
for($i=0;$i<$strsize;$i++){
$i_temp=rand(1,62);
$sessionval .=$sourcestrings[$i_temp];
$fontcolor=imagecolorallocate($image,rand(0,255),rand(0,255),rand(0,255));
$y_i = $height/2 + $font_size /3 ;
imagechar($image,5, 1+ $i * $width /$strsize,5,$sourcestrings[$i_temp],$fontcolor);
}
//寫入session,以後驗證用
unset($_SESSION['cjjer']);
$_SESSION['cjjer'] = $sessionval;
//添加雜點
for($i=0;$i<$width /$height *2;$i++)
{ $i_x=rand(0,$width);
$i_y=rand(0,$height);
$pixelcolor=imagecolorallocate($image,rand(0,255),rand(0,255),rand(0,255));
imagesetpixel($image,$i_x,$i_y,$pixelcolor);
}
header('content-type:image/png');
imagepng($image);
imagedestroy($image);
?>
產生的樣式示範:
線上示範:http://www.phzzy.org/temp/5do8/ex4_login.php
有個很明顯的問題就是產生的圖片不夠豔麗,從而很多的使用者看起來不清楚,這樣吧,我們自己設定幾個比較豔麗的顏色然後輸出,擴充colorarrs數組:
$colorarrs=array(
imagecolorallocate($image,255,255,255),
imagecolorallocate($image,0,0,0),
imagecolorallocate($image,0,70,0),
imagecolorallocate($image,92,0,12),
imagecolorallocate($image,0,0,128),
imagecolorallocate($image,233,10,216)
);
然後把23行變為(17行):
$fontcolor=$colorarrs[rand(1,count($colorarrs)-1)];
輸出:
線上示範:http://www.phzzy.org/temp/5do8/ex5_login.php
例五:大點的比較cool的驗證碼
PS 的映像還是比較小的,有時候為了某些原因(個人網站為了玩cool,just我,商業網站玩風格,吸引使用者,just google,後話),驗證碼不是局限於十幾個px的限制,有時候完全可以整個2百多,沒啥問題,這時候,一種方案是把前面產生的小圖強制大點,可以不? 可以,但是,看起來不夠光滑,這是事實,明顯,寬頻不再是最重要的問題,不說其他的,下面示範幾個比較好看的產生方式:
<?php
session_start();
$width=600;
$height=100;
if($height < $width /6)
$height=$width / 4;
$sourcestrings="0123456789aqwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
//建立對象
$image=imagecreate($width,$height);
$white=imagecolorallocate($image,255,255,255);
imagefill($image,0,0,$white);
//載入字型庫
$fonts= dirname(__FILE__);
putenv('"gdfontpath=".$fonts=.""');
$fontname='arial';
$font_size=floor($height / 2);
//得到字串
unset($sessionval);
$strsize=rand(5,8);
for($i=0;$i<$strsize;$i++){
$i_temp=rand(1,62);
$sessionval .=$sourcestrings[$i_temp];
$x_i =$font_size + $i *$width / ($strsize+1);
$y_i = $height / 2;
$angle_i=rand(-120,120);
$fontcolor_a=imagecolorallocate($image,rand(0,255),rand(0,255),rand(0,255));
imageTTFText($image,$font_size,$angle_i,$x_i,$y_i,$fontcolor_a,$fontname,$sourcestrings[$i_temp]);
}
unset($_SESSION['cjjer']);
$_SESSION['cjjer'] = $sessionval;
//雜點數目
for($i=0;$i<$width * $height / 100;$i++)
{
$i_x=rand(0,$width);
$i_y=rand(0,$height);
imagesetpixel($image,$i_x,$i_y,imagecolorallocate($image,rand(0,255),rand(0,2550),rand(0,255)));
}
//發送對象
header('content-type:image/png');
imagepng($image);
imagedestroy($image);
?>
線上測試: http://www.phzzy.org/temp/5do8/ex6_login.php
解釋性說明:
首先是寬和高,高太小字都看不清楚.隨機提取的字元還是那麼幾個:
$sourcestrings="0123456789aqwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
建立對象,填充成白色:
$image=imagecreate($width,$height);
$white=imagecolorallocate($image,255,255,255);
imagefill($image,0,0,$white);
然後載入您要驗證碼的字型:
$fonts= dirname(__FILE__);//返回當前根目錄,字型檔複製到這裡,字型檔是*.ttf檔案
putenv('"gdfontpath=".$fonts=.""');
$fontname='arial';
定義字元的高度,這裡我設定成高度的一半:
$font_size=floor($height / 2);
清除變數,隨機設定要產生字元的個數:
unset($sessionval);
$strsize=rand(5,8);
迴圈,一個個的把字元打上去:
得到本次迴圈的字串.,並加在變數後面一會兒寫入session
$i_temp=rand(1,62);
$sessionval .=$sourcestrings[$i_temp];
得到寫入映像的字串的位置(x和y座標)
$x_i =$font_size + $i *$width / ($strsize+1);
$y_i = $height / 2;
設定傾斜度,是從正面看的,.
$angle_i=rand(-120,120);
隨機產生顏色,
$fontcolor_a=imagecolorallocate($image,rand(0,255),rand(0,255),rand(0,255));
寫入到映像;
imageTTFText($image,$font_size,$angle_i,$x_i,$y_i,$fontcolor_a,$fontname,$sourcestrings[$i_temp]);
如果對此函數存在疑問,請查閱相關資料.非常容易.
寫入到session,一邊註冊碼使用:
unset($_SESSION['cjjer']);
$_SESSION['cjjer'] = $sessionval;
添加雜點:
//雜點數目
for($i=0;$i<$width * $height / 100;$i++)
{
$i_x=rand(0,$width);
$i_y=rand(0,$height);
imagesetpixel($image,$i_x,$i_y,imagecolorallocate($image,rand(0,255),rand(0,2550),rand(0,255)));
}
輸出到頭:
header('content-type:image/png');//這行表明是png映像,可不要,預設可以輸出的.但不是映像的頭格式
imagepng($image);
imagedestroy($image);
你可以載入你自己的字型庫,設定旋轉角度$angle_i=rand(-120,120);設定字型高度$font_size=floor($height / 2);字型顏色$fontcolor_a和隨機數的個數:$strsize=rand(5,8);
例六:給圖片打上浮水印,產生縮列圖
傳統的ASP頁子打浮水印和產生縮列圖都是比較繁瑣的,一般使用到的是其他組件什麼的,但是,PHP可以輕鬆的幹這些事情,正如您預料,不到30行的程式搞定這一切,請看這個來源程式:
<?php
$source="my.jpg";
$zoom=0.5;
$str='我是帥哥,你是MM麼?';
$image=imagecreatefromjpeg($source);
$width=imagesx($image);
$height=imagesy($image);
$color_red=imagecolorallocate($image,111,0,0);//紅色
$font=dirname(__FILE__). "//simsun.ttc";
$str=iconv('GB2312','UTF-8',$str);
$fontsize=30;
$angle=25;
$fromx=$width/5;
$fromy=$height/2;
imagettftext($image,$fontsize,$angle,$fromx,$fromy,$color_red,$font,$str);
$width_temp=imagesx($image) * $zoom;
$height_temp=imagesy($image) * $zoom;
$img=imagecreatetruecolor($width_temp,$height_temp);
imagecopyresized ($img,$image,0,0,0,0,$width_temp, $height_temp,$width,$height);
imagedestroy($image);
$file_zoomname="my_zoom_jpeg.jpg";
imagejpeg($img,$file_zoomname);
imagedestroy($img);
?>
原始圖片:
產生的jpg圖片:
原始圖片70K, 這裡說下,如果產生gif,檔案18k多,而png要用去76k,so我們產生縮列圖用jpeg格式.
程式碼分析:
這裡我先設定了幾個參數:
$source="my.jpg"; //源圖片
$zoom=0.5; //縮放百分比
$str='我是帥哥,你是MM麼?'; //浮水印的文字
裝載源圖(不打浮水印不裝載):
$image=imagecreatefromjpeg($source);
擷取長,寬的大小:
$width=imagesx($image);
$height=imagesy($image);
設定浮水印字型,因為我們用的是中文,必須匯入中文字型庫,否則寫不上或亂碼,然後必須轉換字串編碼
$font=dirname(__FILE__). "//simsun.ttc";
$str=iconv('GB2312','UTF-8',$str);
設定開始點,字型大小,視角:,寫上字串:
$fontsize=30;
$angle=25;
$fromx=$width/5;
$fromy=$height/2;
imagettftext($image,$fontsize,$angle,$fromx,$fromy,$color_red,$font,$str);
按照縮放的大小要求產生新大小的對象:
$width_temp=imagesx($image) * $zoom;
$height_temp=imagesy($image) * $zoom;
$img=imagecreatetruecolor($width_temp,$height_temp);
把源圖copy到新圖,gd庫的imagecopyresized自動縮放大小的
imagecopyresized ($img,$image,0,0,0,0,$width_temp, $height_temp,$width,$height);
產生小圖片,清除對象:
imagedestroy($image);
$file_zoomname="my_zoom_jpeg.jpg";
imagejpeg($img,$file_zoomname);
imagedestroy($img);
產生縮洌圖,浮水印大體核心技術就這麼點.