当前位置: 首页 > 后端技术 > PHP

练习用PHP快速制作一套属于自己的手写字体

时间:2023-03-29 18:35:44 PHP

一、背景笔者之前在网上看到过民间高手制作字体的相关事迹,觉得把自己的手写字打出来很有意思有了键盘,所以一直有时间想做一套自己的手写体。前几天在网上搜索了一下制作字体的方法,发现技术上并不算太难。结合自己PHP开发的经验,很快做出了一套自己的手写字体。制作字体的过程大致是这样的。首先,我们需要确定哪些字体需要自己编写。确定字体后,我们将使用工具将这批字符制作成模板。但是,汉字的总数是非常大的。搜索了一下,大约是10万个字符左右,这个项目太大了,所以需要找一批我们常用的字体(大约1700个字符),或者是我们经常看到的字体。这个过程需要用PHP来分析。将其提取并制作成模板。在本文中,笔者将完整记录制作字体的过程,并将使用的PHP代码公布出来,方便其他读者使用,同时也为自己做一个备份。2.操作概述提取常用汉字制作字体模板,生成字体文件3.提取常用汉字制作一套字体。工作量比较大,因为汉字比较多,但是我们可以把我们常用的汉字提取出来,优先把这些汉字写完,后面不常用的字体有空就积累起来。这里使用PHP来辅助我们提取常用的汉字。3.1数据收集互联网上有2000个常用的汉字和其他doc文档,但每个人的使用方式不同;因此,我们需要收集一批我们经常接触到的字体数据,例如,从我们自己的笔记和博客、聊天数据、通讯录提取;例如,作者收集了过去的笔记、文章和通讯录。下图为作者往期文章列表。我们把文章的内容复制到一个txt文件中,然后保存到某个文件夹下,如下图3.2去除杂项文章收好后,里面有很多杂项,比如空格,换行符,我们不需要。如下图所示,此时我们可以通过正则表达式删除不需要的内容。笔者使用的匹配非汉字的正则表达式如下:[^\u4e00-\u9fa5]我平时开发用的是phpstorm这个IDE,所以这里教大家如何使用这个IDE删除非汉字中国文字;按住键盘ctrl+r,替换文字内容,然后将正则表达式放入搜索项,勾选regex,则所有非汉字内容都会被选中,如下图:当作者点击全部替换按钮,所有非汉字都被删除,此时我们的内容应该只有一行内容,如下图3.3字体去重整理完文字后,我们现在需要对里面的内容去重到保证只保留一个汉字,因为每个字体模板中的单词只需要写一次;因此,可以使用PHP对汉字进行去重,代码如下)(?!$)/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');//执行去重echomb_str_split($word);这段代码执行时会返回去重后的结果。作者的执行结果如下:从图中可以看出,作者得到了一批正文3.4经过统计和排序去重,得到了一批唯一的汉字,但是字数太多,达到1730个汉字,可能一下子写不完,但是作为开发者当然要注意高效;所以可以用PHP计算优先级,把最常用的字体放在前面,所以我需要写一段PHP代码3.4.1汉字拆分成数组首先,作者将去重后的字符串拆分成数组。因为汉字比较特殊,需要定制一段代码。参考代码如下://将汉字拆分成数组函数ch2arr(string$str){$length=mb_strlen($str,'utf-8');$数组=[];对于($i=0;$i<$length;$i++){$array[]=mb_substr($str,$i,1,'utf-8');}return$array;}3.4.1排序后筛选下载也可以筛选重复次数大于0的汉字,代码如下functionstrSelect(string$string,string$word,$limit=0){//将字符串拆分成数组$cnList=ch2arr($string);foreach($cnListas$val){$result[$val]=substr_count($word,$val);}}//重复高出现在顶部arsort($result);//过滤字符串$ret='';foreach($resultas$key=>$val){if($val>$limit){//$ret.="$key:$val".PHP_EOL;//检查每个单词重复的次数$ret.=$key;}}return$ret;}前两个方法写完后,笔者只需要调用一行代码就可以得到一些最常用的字符,还可以对结果进行过滤。调用代码如下:echostrSelect($str,$allStr,1);代码执行后,作者会对汉字的出现次数进行排序,将出现次数最多的放在前面,过滤掉出现次数大于1的再返回。返回结果如下图所示:从图中可以看到字体顺序发生了很大的变化,数量明显少了更多参考代码地址:http://tuchuang.songboy.net/ziti/code.txt4.制作字体模板找出你经常接触的汉字后,你需要制作一套字体模板。这套字体模板的用处是手写汉字后,可以很顺利的找到对应的汉字。这里需要依赖第三方网站提供的一些功能。4.1字体文件编码下面笔者将PHP计算出的字符写入一个txt文件中。参考命令如下。保存phpquchong.php>result.txt后,需要设置其编码为UTF-8;操作步骤是:先用Windows记事本打开,然后将文件另存为UTF-8编码的文件。笔者用Mac系统无法完成,但用Windows可以顺利完成。推荐使用Windows,如下图所示。4.2生成字体模板现在笔者需要将之前保存的汉字以固定格式的模板显示出来。后面需要用到这个模板来生成字体文件。在这里,就需要一个网站来协助。网址如下:http://www.flexifont.com/网站需要注册。我不会在这里描述注册过程;登录后,点击我的字体,可以看到当前的字体模板,选择自定义,参考下图点击自定义,可以看到一个上传txt文件的表单,如下图上传后作者返回到列表中可以看到刚刚创建的字体模板,如下图4.3手写字体笔者将刚刚创建的模板下载到电脑上并解压。解压后的结果如下图所示,你必须打开这些图片确认它们是正确的,并确认这些文字与上传的文字相对应。如果里面的话明显不是刚才上传的,很可能是你上传的文件编码不对。作者生成的字体如下图确认模板无误后,需要打印这些图片。最好自己有一台打印机。之前买了一台惠普1121打印机,总价不到200元。我建议读者也买一本。有时候打印机真的很方便;打印出来后,作者需要手写相应文字的意思。5.生成字体文件手写字体是一个比较费力的过程。手写完成后,还有一些步骤。如果读者对手机修图比较熟悉,那么这一步可以很快完成。不熟悉的可以看看作者详细的处理方法。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.使用字体字体生成后,作者可以安装字体文件。6.1安装字体在mac和widnows下安装字体都非常简单。字体后直接双击字体文件,会看到下图。笔者直接点击安装字体。下面说说Windows下的安装。其实只需要双击字体文件,然后点击安装即可,如下图。安装字体的时候出错,提示字体无效,所以我换了方法;鼠标右键->Installforallusers又好了,原因不明,如果遇到这种情况的读者也可以试试。6.2使用WPS笔者经常使用word文件。读者喜欢用wps,那么如何在WPS中使用“EasyStyle”其实很简单。输入一些文本后,选择顶部的“简单样式”。是的,效果如下图所示。如果你发现某个字体不属于你的手写风格,那应该是这个字体已经不在你的字体模板中了。您可以生成一个新模板,然后合并以前的字体。6.3补充手写中默认的模板也不错,读者也可以试试,手写不仅可以汉字,还可以使用符号。作者:唐青松微信:songboy8888日期:2018-08-20