PHP總的畫圖功能—-繪製字元之中文的繪製~~

來源:互聯網
上載者:User
繪製中文

    思想:找到相應點的座標,將所有點串連起來就是一個漢字,如老式的點陣印表機
   我們繪製中文,就需要擷取這個漢字所有的點的資訊,把他們描繪出來。繪製中文需要有漢字的點陣字型檔,字型檔裡面儲存的是國際區位碼,我們從這裡面讀取漢字資訊(chs16.fon字型檔檔案)。 
   首先,我們要知道,漢字是由16*16個點構成的,有點的位置為1,否則為0,如:
C字元的資訊如下:
第0行:00000000
第1行:00111110
第2行:01110000
第3行:01110000
第4行:01110000
第5行:01110000
第6行:00111110
第7行:00000000
用雙迴圈去找點的位置,並畫出來。8行8列。
中文是用2個高位為1的ASCII碼錶示。

區位碼與機內碼的換算公式為
【區位碼】+(10100000 10100000)=【機內碼】。即:
    區位碼0 + (10100000) = 機內碼0;
    區位碼1 + (10100000) = 機內碼1;
這樣的話,點陣資料,就可以通過漢字"機內碼"-> "區位碼"進行索引、尋找。
由於一個漢字用了32個位元組,而GB-2312區位碼錶表有94行、94列,那麼,只要知道該字元在表中是第幾個,再乘以32就行了。
用區位碼就可以尋找在區位碼錶中第幾個了,區位碼錶示(區,位)

步驟:

1.用ORD可以擷取一個字元的機內碼,再通過上面的換算公式,得出區位碼(一個漢字的第一個字元是區的資訊,第二個是位的資訊)
2.通過區位碼,查出字元在字型檔中的位置,並得出點陣資訊
3.把點陣資訊放入數組
4.如果為1,在相應的位置繪製點

原理就這麼簡單:)

下面給一段代碼:是別人的代碼

/*************************************
*     檔案名稱:'draw1.0.inc.php
**    中文顯示點陣輸出   version 1.0
**    只提供簡單的操作:輸出預設大小的純中文字串到圖片的座標(0,0)上
**    更多功能,請見下一版本。
*
****************************************/
function draw($image,$string,$color)
{
   $fp=fopen("chs16.fon","rb");//二進位方式讀點陣字型檔chs16.fon
   if (!feof($fp))//如果檔案指標到了檔案末尾,退出,不要忘記關閉檔案
   {
      while($string)//當字串不為0
      {
         $qh=ord(substr($string,0,1))-0xa0;
      $wh=ord(substr($string,1,2))-0xa0;
/* 這兩行代碼,其實是擷取一個中文的機內碼。通過運算到了區位碼。*/
         $offset=(94*($qh-1)+($wh-1))*32;
/*得到了漢字的區位值後,就開始計算位移量了。*/
     fseek($fp,$offset,SEEK_SET);
/*在字型檔檔案$fp中,將檔案指標定位到位移量。*/
         $buffer=preg_split('//', fread($fp,32), -1, PREG_SPLIT_NO_EMPTY);
/* fread($fp,32);是從$fp中讀取32個位元組資料,然後通過preg_split();分配到數組$buffer中。preg_split();是一個支援正則表達的函數。*/
        for($i=0;$i<16;$i++)              //點陣的行數:16 列數也應該是16
       for($j=0;$j<2;$j++)             //因為是兩個位元組,那麼,就要一個一個地畫了
        for($k=0;$k<8;$k++)          //每個位元組,都有8個點的資料
      if(((ord($buffer[$i*2+$j])>>(7-$k))&0x01))//如果這個點的值為1,輸出;否則,沒有
      {
         imagesetpixel($image,$x+8*$j+$k, $i, $color);
             }
      $string=substr($string,2); //中文由兩個位元組表示,所以,輸出一個漢字後,就要去掉兩個位元組。
      $x=24; //一個漢字輸出結束,空開一點,給下一個漢字。因為這個漢字是16×16點,那麼,$x的值設為16,就夠了。但,太擠了不是?
     }
  }
  fclose($fp);
 }
 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.