經驗交流

一個可供 HTML 檔引用的簡易計數器(使用 Image Functions)

問題說明
 早期我在寫學校網頁時,曾在首頁上加個計數器,用來顯示該站的熱門程度。當時,我還不會撰寫 ASP、PHP 之類的程式,卻又想在純 HTML 的環境下動態地產生計數效果,所以我引用了中山大學免費的計數器。它是一支 CGI 程式,會依照使用者傳入之參數值,回傳一個數字圖檔,使用者可以直接在網頁中秀出這個圖來,的確十分方便;但是,程式究竟是人家寫的,資料毀損而導致計數器歸零時,我們也拿它沒辦法。
您是本頁的第位讀者
 如果您會寫一些 PHP 的程式,是不是也可以扮演中山大學的角色,提供免費的計數器供學生在個人網站使用呢?

我的做法
 想利用 PHP 來產生一個 PNG 或 JPEG 格式的圖檔的話,您得先安裝 GD Lib 才行,其安裝步驟請自行參閱相關書籍。請注意,目前的 GD 已經不支援 GIF 格式了,所以您無法藉由 PHP 的 Image Functions 來產生一個 GIF 圖檔。
 我利用以下的程式產生一個三位數的計數圖檔:
執行結果 原始碼
01    header("Content-type: image/png");
02    $dis_im = ImageCreate(60, 20);

03    $src_im = ImageCreateFromPNG("counter/1/1.png");
04    ImageCopy($dis_im, $src_im, 0, 0, 0, 0, 20, 20);

05    $src_im = ImageCreateFromPNG("counter/1/3.png");
06    ImageCopy($dis_im, $src_im, 20, 0, 0, 0, 20, 20);

07    $src_im = ImageCreateFromPNG("counter/1/5.png");
08    ImageCopy($dis_im, $src_im, 40, 0, 0, 0, 20, 20);

09    ImagePNG($dis_im);

10    ImageDestroy($dis_im);
11    ImageDestroy($src_im);
 01 先傳 Header 給瀏覽器,告知檔案格式為 PNG(若欲產生 JPEG 圖檔的話,請改為 image/jpeg)。
 02 定義圖形大小,並用 $dis_im 記下這個圖的識別代號。
 因為我要輸出的圖檔係由三個小圖所組成,每個小圖都是 20 * 20 大小,所以將會組合出一個 60 * 20 的新圖來。
 03 使用 ImageCreateFromPNG 函數讀取一個現有的 PNG 圖檔,並用 $src_im 記下這個圖的識別代號。
 04 使用 ImageCopy 函數,自 $src_im 的左上角(0, 0)起中讀取一個 20 * 20 的區域(就是整個 $src_im 啦),然後貼在 $dis_im 的(0, 0)位置。
 05 - 08 重複兩次 03 - 04 的動作,只是貼圖的位置不同,分別改為(20, 0)與(40, 0)。
 09 將 $dis_im 的內容輸出為一個 PNG 圖檔。
 10 - 11 分別釋放 $dis_im 與 $src_im 所佔用的記憶體。

進階做法
 上述的程式只是在說明 PHP 作圖的重要步驟,真要實際應用在多人共用的情況下,得結合資料庫才行。
 我建立了一個名為 demo_counter 的資料表,它只有兩個欄位:owner 與 amount。透過以下的程式中去存取每位 owner 在資料庫中的 amount 值,來組合成一個計數圖檔。
 該圖檔之大小依 amount 之位數而定,前方不補零。我將 amount 的資料型態設為 Integer(4 bytes),所以最多可儲存到十位數。同時這個圖檔還可依傳入的 style 參數,來組合出不同風格的計數圖形。
執行結果 原始碼 下載原始碼(含圖檔)
 只要您去重整這個計數器所在的網頁,計數值就會立刻加 1。對於實際訪客人數而言,這可能有些浮濫,但是對喜歡人氣指數高的使用者來說,應該不會介意才是。
 若您要將計數器開放給他人使用時,請為每個申請者在 counter 的資料表建立其帳號(owner),並將其計數初值(amount)設為 1。
經驗交流