使用PHP辅助 快速制做一套本身的手写字体实践

1、背景

笔者之前在网上看到有民间高手制做字体的相关事迹,以为把本身的手写字用键盘敲出来是一件颇有意思的事情,因此一直有时间想制做一套本身的手写体,前几天在网上搜索了一下制做字体的方法,发现技术上并非太难,结合了本身PHP方面的开发经验,很快的作出了一套本身的手写字体。php

制做字体的流程大体是这样,首先咱们须要肯定那些字体须要本身写,肯定了字体以后将这一批字利用工具作成一个模板,不过汉字的总量很是的多,搜索了一下大概在10万字左右,这个工程量太大,所以咱们须要找出一批属于本身经常使用的字体(大概1700字左右),或者本身所常见到的字体,这个过程就须要用PHP来分析,分析出来以后再将其提取出来,作成模板。正则表达式

在这篇文章当中笔者将完整的记录制做字体过程,其中会将用到的PHP代码公布出来,方便其余读者使用,也给本身留个备份。windows

2、操做概要

  1. 提取经常使用汉字
  2. 制做字体模板
  3. 生成字体文件

3、提取经常使用汉字

作一套字体的工做量是比较大的,由于汉字数量比较多,不过咱们能够将咱们经常使用的汉字提取出来,优先将这写汉字的作出来,后面不经常使用的字体空闲时再去累加,这里咱们用到了PHP来辅助咱们提取经常使用的汉字。数组

3.1 收集数据

在网络中有各类2000个经常使用汉字之类的doc文档,可是每一个人所用到的却不同;所以咱们须要收集一批本身常常接触的字体数据,好比能够从本身的笔记、博客、聊天数据、通信录中提取;好比笔者便将以往的笔记、文章、通信录收集了起来,以下图则是笔者过往的文章列表微信

image

咱们将文章内容复制到txt文件当中,而后保存到某一个文件夹当中,以下图所示网络

image

3.2 去除杂项

收集了文章以后,里面有不少杂项,好比空格和换行,这些内容咱们并不须要,以下图所示phpstorm

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、制做字体模板

把本身最常接触的汉字找出来以后,须要制做一套字体模板,这套字体模板的用处是让手写汉字后,顺利的找到对应的汉字,这里须要依靠第三方网站提供的一些功能。

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、生成字体文件

手写字体是一个比较辛苦的过程,手写完成以后还有一些步骤,若是读者比较熟悉用手机编辑图片,那么这一步很快就能完成,若是不熟悉,就详细的看一下笔者的处理方法吧。

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、使用字体

当字体生成完成以后,笔者安装字体文件便可

6.1 安装字体

安装字体在mac下和widnows下都很是简单,首先看看mac下安装方法,下载字体以后,能够直接双击字体文件,会看到以下图

image

笔者直接点击安装字体就能够了

再说说windows下安装,其实也只须要双击字体文件便可,而后点击安装,以下图所示

image

不过笔者在电脑在安装字体的时候出现了错误,提示字体无效,因而我换了一种方式;右击鼠标->为全部用户安装 又好了,缘由未知,若是读者出现这种状况也能够试试。

6.2 在WPS中使用

笔者不少时候都会使用到word文件,读者喜欢用wps,那么如何在WPS中使用“轻松体”呢,其实很是简单,在随便输入一些文字以后,在上方选择“轻松体”便可,效果以下图所示

image

若是发现某个字体不是你手写的风格,那应该是这个字体再也不你的字体模板当中,你能够生成一个新的模板,而后合并以前的字体便可。

6.3 补充

在手写体当中默认的模板也不错,读者也能够去尝试一下,另外不只仅汉字能够作手写体,符号也能够。


做者:汤青松

微信:songboy8888

日期:2018年8月20号

相关文章
相关标签/搜索