使用PHP輔助快速製作一套自己的手寫字型實踐

apache發表於2018-08-21

一、背景

筆者以前在網上看到有民間高手製作字型的相關事蹟,覺得把自己的手寫字用鍵盤敲出來是一件很有意思的事情,所以一直有時間想製作一套自己的手寫體,前幾天在網上搜尋了一下製作字型的方法,發現技術上並不是太難,結合了自己PHP方面的開發經驗,很快的做出了一套自己的手寫字型。

製作字型的流程大致是這樣,首先我們需要確定那些字型需要自己寫,確定了字型之後將這一批字利用工具做成一個模板,不過漢字的總量非常的多,搜尋了一下大概在10萬字左右,這個工程量太大,因此我們需要找出一批屬於自己常用的字型(大概1700字左右),或者自己所常見到的字型,這個過程就需要用PHP來分析,分析出來之後再將其提取出來,做成模板。

在這篇文章當中筆者將完整的記錄製作字型過程,其中會將用到的PHP程式碼公佈出來,方便其他讀者使用,也給自己留個備份。

二、操作概要

  1. 提取常用漢字
  2. 製作字型模板
  3. 生成字型檔案

三、提取常用漢字

做一套字型的工作量是比較大的,因為漢字數量比較多,不過我們可以將我們常用的漢字提取出來,優先將這寫漢字的做出來,後面不常用的字型空閒時再去累加,這裡我們用到了PHP來輔助我們提取常用的漢字。

3.1 收集資料

在網路中有各種2000個常用漢字之類的doc文件,但是每個人所用到的卻不一樣;因此我們需要收集一批自己經常接觸的字型資料,比如可以從自己的筆記、部落格、聊天資料、通訊錄中提取;比如筆者便將以往的筆記、文章、通訊錄收集了起來,如下圖則是筆者過往的文章列表

image

我們將文章內容複製到txt檔案當中,然後儲存到某一個資料夾當中,如下圖所示

image

3.2 去除雜項

收集了文章之後,裡面有很多雜項,比如空格和換行,這些內容我們並不需要,如下圖所示

image

此時可以通過正規表示式將不需要的內容刪除,筆者使用的匹配非中文的正規表示式如下:

[^\u4e00-\u9fa5]
複製程式碼

筆者平時開發習慣使用phpstorm這款IDE,因此這裡教大家使用此IDE來刪除非中文字元;按住鍵盤 ctrl+r,替換文字內容,然後將正規表示式放入查詢項當中,並且勾選regex,此時所有非漢字內容會被選中,如下圖所示:

image

當筆者點選Replace all按鈕時,變刪除了所有非中文字元,此時我們的內容應該只有一行內容,如下圖所示

image

3.3 字型去重

在整理好文字之後,我們現在需要對裡面的內容進行去重,保證每一個漢字只保留一個,因為我們字型模板每個字只需要寫一次就可以;因此可以使用PHP對漢字進行去重,程式碼如下所示

<?php

//漢字去重函式
function mb_str_split(string $string)
{
    return implode('', array_unique(preg_split('/(?<!^)(?!$)/u', $string)));
}

//將收集的漢字資料讀取出來
$word = file_get_contents('ziti/shoulu.txt');
$word .= file_get_contents('ziti/phpsafe.txt');
$word .= file_get_contents('ziti/reming.txt');
$word .= file_get_contents('ziti/2000.txt');
$word .= file_get_contents('ziti/https.txt');
$word .= file_get_contents('ziti/wangwen/wuxian.txt');
$word .= file_get_contents('ziti/wangwen/qixi.txt');
$word .= file_get_contents('ziti/wangwen/qiantan.txt');
$word .= file_get_contents('ziti/wangwen/jiaoyi.txt');

//執行去重
echo mb_str_split($word);
複製程式碼

當這段程式碼被執行之後,會返回去重後的結果,筆者執行結果如下圖:

image

從圖中可以看出,筆者已經得到了一批去重後的文字

3.4 統計並排序

去重之後已經得到了一批獨一無二的漢字,但是字數實在太多,達到了1730個漢字,可能一下寫不完,不過作為開發者當然是要講究高效率的;所以可以通過PHP來進行優先順序的計算,把最常用到字型排在前面,因此筆者需要寫一段PHP程式碼。

3.4.1 漢字拆分陣列

首先筆者將去重後的字串拆分成陣列,因為漢字比較特殊,所以需要自定義一段程式碼,參考程式碼如下:

//把漢字拆分為陣列
function ch2arr(string $str)
{
    $length = mb_strlen($str, 'utf-8');
    $array = [];
    for ($i = 0; $i < $length; $i++) {
        $array[] = mb_substr($str, $i, 1, 'utf-8');
    }
    return $array;
}

複製程式碼

3.4.1 排序後篩選

下載筆者需要通過foreach來遍歷統計每個字出現的次數,並且安裝倒序排序,如果limit大於0,還可以篩選重複次數大於0的漢字,程式碼如下

function strSelect(string $string, string $word, $limit = 0)
{
    //把字串分割為陣列
    $cnList = ch2arr($string);
    foreach ($cnList as $val) {
        $result[$val] = substr_count($word, $val);
    }

    //重複高的出現在最前
    arsort($result);

    //篩選字串
    $ret = '';
    foreach ($result as $key => $val) {
        if ($val > $limit) {
//            $ret .= "$key:$val".PHP_EOL;  //檢視每個字重複的次數
            $ret .= $key;
        }

    }

    return $ret;
}
複製程式碼

在前面兩個方法寫完之後,筆者只需要呼叫一行程式碼即可得出最常用的一些字元,也可以篩選結果,呼叫程式碼如下:

echo strSelect($str, $allStr, 1);
複製程式碼

程式碼執行之後,筆者將會安裝漢字出現的次數進行排序,把最常見的字元排在前面,並且篩選出現次數大於1的才返回,返回結果如下圖所示:

image

從圖中可以看到字型順序已經發生了很大變化,數量明顯少了很多。

參考程式碼地址:

http://tuchuang.songboy.net/ziti/code.txt
複製程式碼

四、製作字型模板

把自己最常接觸的漢字找出來之後,需要製作一套字型模板,這套字型模板的用處是讓手寫漢字後,順利的找到對應的漢字,這裡需要依靠第三方網站提供的一些功能。

4.1 字型檔案編碼

現在筆者將PHP計算的字元寫入到一個txt檔案當中,參考命令如下

php quchong.php  > result.txt
複製程式碼

儲存之後,還需要將它的編碼設定為UTF-8;操作步驟為:首先用windows的記事本開啟,然後將檔案另存為UTF-8編碼的檔案,筆者用mac系統怎麼也不行,使用windows很順利的就完成了,建議使用windows,如下圖所示

image

4.2 生成字型模板

現在筆者需要將之前儲存的漢字,用固定格式的模板展現出來,後期需要用此模板生成字型檔案,這裡需要用到一個網站來輔助,網站地址如下

http://www.flexifont.com/
複製程式碼

網站需要註冊,註冊過程筆者這裡將不做描述;在登陸之後點選我的字型,可以看到當前的字型模板,選擇自定義,參考下圖

image

點選自定義之後,筆者能看到一個上傳txt檔案的表單,如下圖所示

image

上傳完成之後,筆者回到列表當中,就可以看到剛才建立的字型模板,如下圖所示

image

4.3 手寫字型

筆者將剛才建立的模板下載到電腦當中,並解壓該檔案,解壓後的結果如下圖所示

image

這裡一定要開啟這些圖片確認無誤,確認這些字和上傳的字能對應的上,如果裡面的字明顯不是剛才上傳的,很有可能是你上傳檔案的編碼不正確,筆者生成的字型模板如下圖所示

image

確認無誤後需要將這幾張圖片列印下來,最好自己有印表機,筆者之前買過一款惠普的1121印表機,總價格不到200塊錢,建議各位讀者也買一個,有印表機有時候真的很方便;

列印出來之後,就需要筆者將對應文字意義手寫。

五、生成字型檔案

手寫字型是一個比較辛苦的過程,手寫完成之後還有一些步驟,如果讀者比較熟悉用手機編輯圖片,那麼這一步很快就能完成,如果不熟悉,就詳細的看一下筆者的處理方法吧。

5.1 拍照

首先需要將剛才手寫的文字進行拍照,拍照的時候注意儘量平著拍,需要把4個黑邊拍進去;筆者使用的是iPhone手機,因此非常建議使用iPhone的讀者將相機的網格線功能開啟,因為這樣就可以看出手機是否是平著拍的,在設定->相機->網格線,參考如下圖

image

設定好之後,筆者再次開啟相機,就能看到網格線,如下圖所示

image

中間的十字架如果是黃顏色的,說明筆者當前是平著拍攝的,這樣拍照的時候圖片就不會那麼斜了。

5.2 處理圖片

雖然在拍照的時候已經很用心的去拍攝,但拍的過程當中難免有一些不滿意,這個時候可以用手機簡單處理一下,筆者這裡依然以iPhone手機為例

開啟相簿檢視圖片的右上方有一個編輯功能,如下圖所示

點選編輯之後,在左下角有一個方塊按鈕,點選之後可以對圖片進行放大縮小的跳轉,以及旋轉,對齊等功能,讀者可以自己去操作一番,將圖片儘量調整到理想的狀態。

筆者處理後的效果如下圖所示

image

5.3 上傳並生成字型

現在開啟字型上傳頁面,把筆者已經處理過的圖片上傳到手寫體網站當中了,URL地址如下

http://www.flexifont.com/flexifont-chn/add_font/
複製程式碼

如下圖所示,手寫體站點的一些規則

image

需要記住別選擇錯模板(筆者一開始沒選擇對,還以為系統出問題了),然後把字型上傳,上傳完成之後,可以點選檢視佇列,看看當前的字型處理狀態,URL地址如下

http://www.flexifont.com/flexifont-chn/queuers/
複製程式碼

筆者上傳字型後,不到1分鐘便已經處理完成,處理完成之後,可以在我的字型下方看到字型列表,如下圖所示

image

六、使用字型

當字型生成完成之後,筆者安裝字型檔案即可

6.1 安裝字型

安裝字型在mac下和widnows下都非常簡單,首先看看mac下安裝方法,下載字型之後,可以直接雙擊字型檔案,會看到如下圖

image

筆者直接點選安裝字型就可以了

再說說windows下安裝,其實也只需要雙擊字型檔案即可,然後點選安裝,如下圖所示

image

不過筆者在電腦在安裝字型的時候出現了錯誤,提示字型無效,於是我換了一種方式;右擊滑鼠->為所有使用者安裝 又好了,原因未知,如果讀者出現這種情況也可以試試。

6.2 在WPS中使用

筆者很多時候都會使用到word檔案,讀者喜歡用wps,那麼如何在WPS中使用“輕鬆體”呢,其實非常簡單,在隨便輸入一些文字之後,在上方選擇“輕鬆體”即可,效果如下圖所示

image

如果發現某個字型不是你手寫的風格,那應該是這個字型不再你的字型模板當中,你可以生成一個新的模板,然後合併之前的字型即可。

6.3 補充

在手寫體當中預設的模板也不錯,讀者也可以去嘗試一下,另外不僅僅漢字可以做手寫體,符號也可以。


作者:湯青松

微信:songboy8888

日期:2018年8月20號

相關文章