使用PHP輔助快速製作一套自己的手寫字型實踐
一、背景
筆者以前在網上看到有民間高手製作字型的相關事蹟,覺得把自己的手寫字用鍵盤敲出來是一件很有意思的事情,所以一直有時間想製作一套自己的手寫體,前幾天在網上搜尋了一下製作字型的方法,發現技術上並不是太難,結合了自己PHP方面的開發經驗,很快的做出了一套自己的手寫字型。
製作字型的流程大致是這樣,首先我們需要確定那些字型需要自己寫,確定了字型之後將這一批字利用工具做成一個模板,不過漢字的總量非常的多,搜尋了一下大概在10萬字左右,這個工程量太大,因此我們需要找出一批屬於自己常用的字型(大概1700字左右),或者自己所常見到的字型,這個過程就需要用PHP來分析,分析出來之後再將其提取出來,做成模板。
在這篇文章當中筆者將完整的記錄製作字型過程,其中會將用到的PHP程式碼公佈出來,方便其他讀者使用,也給自己留個備份。
二、操作概要
- 提取常用漢字
- 製作字型模板
- 生成字型檔案
三、提取常用漢字
做一套字型的工作量是比較大的,因為漢字數量比較多,不過我們可以將我們常用的漢字提取出來,優先將這寫漢字的做出來,後面不常用的字型空閒時再去累加,這裡我們用到了PHP來輔助我們提取常用的漢字。
3.1 收集資料
在網路中有各種2000個常用漢字之類的doc文件,但是每個人所用到的卻不一樣;因此我們需要收集一批自己經常接觸的字型資料,比如可以從自己的筆記、部落格、聊天資料、通訊錄中提取;比如筆者便將以往的筆記、文章、通訊錄收集了起來,如下圖則是筆者過往的文章列表
我們將文章內容複製到txt檔案當中,然後儲存到某一個資料夾當中,如下圖所示
3.2 去除雜項
收集了文章之後,裡面有很多雜項,比如空格和換行,這些內容我們並不需要,如下圖所示
此時可以通過正規表示式將不需要的內容刪除,筆者使用的匹配非中文
的正規表示式如下:
[^u4e00-u9fa5]
筆者平時開發習慣使用phpstorm這款IDE,因此這裡教大家使用此IDE來刪除非中文字元;按住鍵盤 ctrl
+r
,替換文字內容,然後將正規表示式放入查詢項當中,並且勾選regex
,此時所有非漢字內容會被選中,如下圖所示:
當筆者點選Replace all
按鈕時,變刪除了所有非中文字元,此時我們的內容應該只有一行內容,如下圖所示
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);
當這段程式碼被執行之後,會返回去重後的結果,筆者執行結果如下圖:
從圖中可以看出,筆者已經得到了一批去重後的文字
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的才返回,返回結果如下圖所示:
從圖中可以看到字型順序已經發生了很大變化,數量明顯少了很多。
http://tuchuang.songboy.net/ziti/code.txt
四、製作字型模板
把自己最常接觸的漢字找出來之後,需要製作一套字型模板,這套字型模板的用處是讓手寫漢字後,順利的找到對應的漢字,這裡需要依靠第三方網站提供的一些功能。
4.1 字型檔案編碼
現在筆者將PHP計算的字元寫入到一個txt檔案當中,參考命令如下
php quchong.php > result.txt
儲存之後,還需要將它的編碼設定為UTF-8;操作步驟為:首先用windows的記事本開啟,然後將檔案另存為UTF-8編碼的檔案,筆者用mac系統怎麼也不行,使用windows很順利的就完成了,建議使用windows
,如下圖所示
4.2 生成字型模板
現在筆者需要將之前儲存的漢字,用固定格式的模板展現出來,後期需要用此模板生成字型檔案,這裡需要用到一個網站來輔助,網站地址如下
http://www.flexifont.com/
網站需要註冊,註冊過程筆者這裡將不做描述;在登陸之後點選我的字型
,可以看到當前的字型模板,選擇自定義,參考下圖
點選自定義之後,筆者能看到一個上傳txt檔案的表單,如下圖所示
上傳完成之後,筆者回到列表當中,就可以看到剛才建立的字型模板,如下圖所示
4.3 手寫字型
筆者將剛才建立的模板下載到電腦當中,並解壓該檔案,解壓後的結果如下圖所示
這裡一定要開啟這些圖片確認無誤,確認這些字和上傳的字能對應的上,如果裡面的字明顯不是剛才上傳的,很有可能是你上傳檔案的編碼不正確,筆者生成的字型模板如下圖所示
確認無誤後需要將這幾張圖片列印下來,最好自己有印表機,筆者之前買過一款惠普的1121印表機,總價格不到200塊錢,建議各位讀者也買一個,有印表機有時候真的很方便;
列印出來之後,就需要筆者將對應文字意義手寫。
五、生成字型檔案
手寫字型是一個比較辛苦的過程,手寫完成之後還有一些步驟,如果讀者比較熟悉用手機編輯圖片,那麼這一步很快就能完成,如果不熟悉,就詳細的看一下筆者的處理方法吧。
5.1 拍照
首先需要將剛才手寫的文字進行拍照,拍照的時候注意儘量平著拍,需要把4個黑邊拍進去;筆者使用的是iPhone手機,因此非常建議使用iPhone的讀者將相機的網格線功能開啟,因為這樣就可以看出手機是否是平著拍的,在設定
->相機
->網格線
,參考如下圖
設定好之後,筆者再次開啟相機,就能看到網格線,如下圖所示
中間的十字架如果是黃顏色的,說明筆者當前是平著拍攝的,這樣拍照的時候圖片就不會那麼斜了。
5.2 處理圖片
雖然在拍照的時候已經很用心的去拍攝,但拍的過程當中難免有一些不滿意,這個時候可以用手機簡單處理一下,筆者這裡依然以iPhone手機為例
開啟相簿檢視圖片的右上方有一個編輯功能,如下圖所示
點選編輯之後,在左下角有一個方塊按鈕,點選之後可以對圖片進行放大縮小的跳轉,以及旋轉,對齊等功能,讀者可以自己去操作一番,將圖片儘量調整到理想的狀態。
筆者處理後的效果如下圖所示
5.3 上傳並生成字型
現在開啟字型上傳頁面,把筆者已經處理過的圖片上傳到手寫體網站當中了,URL地址如下
http://www.flexifont.com/flexifont-chn/add_font/
如下圖所示,手寫體站點的一些規則
需要記住別選擇錯模板(筆者一開始沒選擇對,還以為系統出問題了),然後把字型上傳,上傳完成之後,可以點選檢視佇列,看看當前的字型處理狀態,URL地址如下
http://www.flexifont.com/flexifont-chn/queuers/
筆者上傳字型後,不到1分鐘便已經處理完成,處理完成之後,可以在我的字型下方看到字型列表,如下圖所示
六、使用字型
當字型生成完成之後,筆者安裝字型檔案即可
6.1 安裝字型
安裝字型在mac下和widnows下都非常簡單,首先看看mac下安裝方法,下載字型之後,可以直接雙擊字型檔案,會看到如下圖
筆者直接點選安裝字型就可以了
再說說windows下安裝,其實也只需要雙擊字型檔案即可,然後點選安裝,如下圖所示
不過筆者在電腦在安裝字型的時候出現了錯誤,提示字型無效,於是我換了一種方式;右擊滑鼠
->為所有使用者安裝
又好了,原因未知,如果讀者出現這種情況也可以試試。
6.2 在WPS中使用
筆者很多時候都會使用到word檔案,讀者喜歡用wps,那麼如何在WPS中使用“輕鬆體
”呢,其實非常簡單,在隨便輸入一些文字之後,在上方選擇“輕鬆體
”即可,效果如下圖所示
如果發現某個字型不是你手寫的風格,那應該是這個字型不再你的字型模板當中,你可以生成一個新的模板,然後合併之前的字型即可。
6.3 補充
在手寫體當中預設的模板也不錯,讀者也可以去嘗試一下,另外不僅僅漢字可以做手寫體,符號也可以。
作者:湯青松
微信:songboy8888
日期:2018年8月20號
相關文章
- 《Nestjs 最佳實踐》,一套自己製作的Nestjs框架實戰教程JS框架
- 使用svg製作字型圖示SVG
- 自己動手寫 PHP 框架(一)PHP框架
- 自己編寫安裝製作程式 (轉)
- 怎麼自己製作地圖?如何快速實現簡單地圖繪製?地圖
- 網店logo自己製作,電商產品圖片如何快速製作Go
- 使用 DartPad 製作程式碼實踐教程Dart
- 製作容器映象的最佳實踐
- 自己動手2小時學會配置遊戲輔助遊戲
- 自己動手製作elasticsearch-head的Docker映象ElasticsearchDocker
- 最佳WEB字型排版實踐的簡明指導手冊Web
- 自己動手製作elasticsearch的ik分詞器的Docker映象Elasticsearch分詞Docker
- 寫給自己的git多人開發最佳實踐Git
- 製作 Python Docker 映象的最佳實踐PythonDocker
- 【PHP】PHP專案製作PHP
- 遊戲角色寫實頭髮製作遊戲
- 使用PHP結合Ffmpeg快速搭建流媒體服務實踐PHP
- Rainbond的 Gateway API 外掛製作實踐AIGatewayAPI
- 自己寫的和收藏的一寫php函式PHP函式
- 使用tdcss.js輕鬆製作自己的style guideCSSJSGUIIDE
- Docker 必知必會3----使用自己製作的映象Docker
- 手寫一個自己的PromisePromise
- 手寫自己的MyBatis框架-SqlSessionMyBatis框架SQLSession
- 全面剖析《自己動手寫作業系統》的pmtest1.asm作業系統ASM
- 自己動手寫PromisePromise
- 自己動手寫作業系統(第一天)作業系統
- PHP驗證碼的製作PHP
- PHP入門教程之編寫自己的PHP框架PHP框架
- xlam外掛製作實驗手冊
- 如何用Python製作自己的遊戲Python遊戲
- 自己製作redis 和mongo 映象RedisGo
- 自己製作MyEclipse序列號Eclipse
- 自己手寫的JS小工具JS
- AI教程:製作寫實主義的乳酪圖案AI
- 手機寫作業系統之 製作第1個啟動盤作業系統
- 使用Vue製作一個屬於自己的音樂播放器!Vue播放器
- 62_索引管理_快速上機動手實戰修改分詞器以及定製自己的分詞器索引分詞
- 給自己的軟體製作註冊碼