程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 在 PHP 中用描點法“繪制”中文

在 PHP 中用描點法“繪制”中文

編輯:關於PHP編程

前言:
現在,越來越多的人喜歡上網了,越來越多的人擁有了自己的個人主頁。隨著各種自動化軟件工具的出現,制作網頁越來越簡單。但,由於特效隨處可得,創新的東西,越來越少。說不定,哪天,你會發現某個網站上的計數器和自己的一模一樣。網頁越做越老練。網頁上的東西,也越來越多,越來越豐富。
設問:

  • 在網頁上,如果我要添加一個計數器:
    以前,那就去空間提供商那裡要個鏈接,或其他地方去復制個地址,但這一些,總歸是別人做的,好不好,你是沒有太多的發言權的,只能一個一個地找。
  • 在網頁上,我要將一些信息發布出去:
    假如信息是文本,做一個新頁面,加個鏈接;
    是數據,做一個新頁面,加個鏈接:
    可要是這些數據經常更新,甚至,每小時、每分鐘,都可能會改變,你是否願意守在電腦前,不停修改、上傳呢?(咱可不是商業網站,沒有人願意為你而燒錢。)
    而留言板、聊天室、論壇,這些,決不是單靠HTML和JAVASCRIPT就能搞定的。

為了實現更多的自動控制,可以使用CGI(Common Gateway Interface)程序來實現這些功能。
軟件需求:
PHP:GD Library
配置支持PHP的服務器。我用OmniHTTPd Professional

對於計數器和實時數據統計、發布,我們可以用圖片來完成。在圖片中輸出文字。
在PHP中,要創建一個圖片,並在上面顯示點內容,基本步驟如下:

//http頭,告訴浏覽器,這是一個GIF圖片
header ("Content-type: image/gif");
// 要畫畫,先要有花布不是?創建一個400×300調色板圖像
$im = imagecreate (400, 300);
$black = imagecolorallocate ($im, 0, 0, 0);
// 默認黑色背景。
//(默認,是指第一個定義的顏色。如果在此行代碼前面定義了另一個顏色,那麼,最先定義的那個,就是默認背景顏色。)
$red = imagecolorallocate ($im, 255, 0, 0);
//紅色。如果這兩行交換,你會發現背景是紅色,文字是黑色。
$string="1234567890";
// 要繪制的字符
imagestring ($im,12,10,10,$string,$red);
//在(10,10)開始繪制字符串
imagepng ($im);
// 以png格式輸出,也可以用imagejpeg($im);或magegif($im);但後者,如果GD版本高於1.6,就不能用了。
imagedestroy ($im);
// 結束,清除所有占用的內存資源
?>


上面示例,在400×300的圖片上,自點(10,10)開始,繪制12磅的"1234567890"。你有沒有注意到這張圖片的大小是:251字節!你也可以試試其他的輸出格式。
圖片的大小,與圖片中非背景象素點數有關,跟輸出多少象素無關。

然而,有一個問題。
你可以用imagestring()輸出如下的信息:
imagestring($im,1,0,0,"abcdefghijklmnopqrstuvwxyz0123456789~!@#$%^&*()_+{}|:"<>?[]';,./",$red);
可是,你無法正確輸出中文!!!
imagestring($im,1,0,0,"啊",$red);
你看到的,決不是中文!!而是亂碼。
PHP默認的字符集是UTF-8,而簡體中文是GB2312。

如何解決?!
為了解決這個問題,你可以讓PHP加載擴展模塊php_iconv.dll(UNIT下的後綴名是.SO),不過,有時候,可能不能正常工作。本來,我要把一段測試代碼放上來,可這次,怎麼弄都沒有成功。為了避免錯誤,我還是不把它們放上來了。
但,最致命的,如果你的空間服務商關閉了該擴展模塊,或者,甚至禁止了加載模塊的DL()函數,那,你就只能跟中文BYE-BYE了。
還好,還有其他辦法。
可以通過字符映射,將預先轉換好的碼表中字符輸出來。但,你需要一張碼表!
或者,手工繪制每一個中文的每一個點!感覺怎麼樣?!

好,來吧,我們一起來畫字!

畫字,首先要知道怎麼畫。
初中的簡單函數,學過吧?要畫出函數的圖形,做過吧?算出某點的坐標,然後連接兩相鄰點。這種方法,叫描點法。
我們要做的,是盡量多地將點算出來,然後在相應坐標顯示出來。
你是否聽說過點陣打印機、點陣漢字?
在輸出漢字時,它們是用一個個點來表示的。

在某個坐標上顯示一個某種顏色的點的函數是:
int imagesetpixel ( resource image, int x, int y, int color)
假定我要在坐標(100,100)處顯示一個白色的點,那麼,只需如下代碼:

header ("Content-type: image/gif");
$image = imagecreate (400, 300);
$black = imagecolorallocate ($image, 0, 0, 0);
$white = imagecolorallocate ($image, 255, 255, 255);          // 定義白色
imagesetpixel ( $image, 100, 100, $white);
imagepng ($image);
imagedestroy ($image);
?>


也就是說,我們只要獲取某個漢字的所有點的信息,我們就能夠通過這個函數,輸出那個漢字。

在文件chs16.fon裡,保存的,是國標區位碼表(國家標准信息交換用漢字編碼基本字符集GB-2312)。它是漢字的點陣字庫。(WIN98系統中,此文件在c:windowscommand下。如果你要把它放在UNIX系統下使用,請注意大小寫。如果沒有,你可以在文末找到鏈接。)
它是MSDOS時代的,但,好東西,還是應該拿出來一用的。

從chs16.fon裡,我們可以讀取漢字的點陣數據。每個漢字,都是由16×16個點構成的。筆劃走過的地方,點的值為1,否則為0;每個點占用一個位,每8個點構成一個字節。那麼,一個漢字,就需要(16×16÷8=32)字節。

下面這個實例,是為了說明字符點陣的表示方法。
這裡,定義了一個8×8的矩陣,顯示了一個字母C,白色的方塊用0表示,黑色方塊用1表示,那麼,這八行圖形的代碼分別是:


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved