个性化字体APP设计与实现

2023-03-13 03:54易多刘纯慧舒畅
科技风 2023年6期
关键词:字库字符字体

易多 刘纯慧 舒畅

湖南警察学院 湖南长沙 410138

书法作为中国上千年的传承之物,是中国文化的代表作,汉字则是汉民族文化经历数千年积累、沉淀所形成的思想智慧的结晶。随着科技的革新和互联网的发展,电脑和手机已经完全融入了人们的日常生活。伴随着互联网技术的日益成熟和手机电脑的普及,现阶段的“敲字如飞”逐渐替代了传统汉字一笔一画的书写。对于汉字这一传统文化而言,长时间使用手机和电脑使得许多人只能大致记住其形态,提笔才发现无法正确地写出其具体的部首结构。设计出这样一款APP不但能满足个人对个性化字体的需求,也让人们重新认识手写字体的重要性,避免“提笔忘字”的尴尬。对于以往的书法类APP而言,“字游”APP能够通过拍照识图、手绘字体的方式获取到个人的字体,再将图像字体轮廓录入字库,将个人字体转换为图文的形式再嵌入输入法中,能够实现个人个性化字体在互联网上的流通。

一、个性化字体的原理

(一)字符编码的发展历程

谈及字体库数字化的呈现,不得不追溯字符编码的发展历程,在此只简单介绍其中的一部分。初期由美国科学家开发了电子计算机,为了便于自身使用,ASCII编码应运而生,所有英文符号、数字和标点符号都能够在电脑上正确表达。科研人员发现共有128个这样的字符,故规定用8位二进制来表达每一个字符。随后,一些非英语母语的发达国家也引进了计算机,而其母语字数也在128位之内,正好填补了之前ASCII码128~256位的空白,便各自将ASCII码进行扩展,将其后128位字符表示为各自的母语字体。例如,在法语中的“é”,它的ASCII编码是130(二进制10000010),但在希伯来语编码中的同等位数又显示是Gimel,在其他编码中又会是另一种字符。因此不管怎样,ASCII扩展码中0~127表示的符号都是一样的,而128~255的这一段却大相径庭。

当我国开始使用计算机时,由于汉字的数量远大于2的8次方,我们开始自行摸索继而有了GB2312字符编码的诞生。其规定前127位字符与ASCII码相同,大于127位的码数用于定义汉字,采用两个8位二进制定义一个字符。其规定以8位一组,将前一个字节称为高字节,后一个字节称为低字节,可组合表示6763个简体汉字,依照汉字的拼音、部首和笔画进行排序。一直到后来ISO(国际标准化组织)推出了Unicode(万国码),各国才有了一个统一且能涵盖各国字体的规范化字符编码。

(二)字库文件的存储格式

在机器中,可视化的字体都源于本机的字体库。就电脑中字体而言,windows系统所采用的默认字体为“微软雅黑”,在C:WindowsFonts路径下我们会发现,windows系统中还装有“仿宋常规”“楷体常规”等以.ttf为后缀的多种字体。也就是说,由个人创造的字体库也同样需要写入该路径中,电脑才能对其进行检索、解析及调用。再使用界面中自带的“查找字符”功能分别去查看这些字体的字符映射表,不难发现,相同位置的字体所对应的字体字符编码都是采用ucs-2编码(Unicode编码中的一种),并且都为同一个字。我们可以从中得知其中的映射关系——字体的存储就好比是一张相片对应着一个相框,不管相片的大小颜色如何改变,电脑的理解都只停留在相框这一层。

(三)字体形态的存储原理

TTF(True Type Font)是由微软与APPle公司联合发布的字体文件格式。随着Windows的普及,已成为目前最普遍的一个字体文档显示方法。

True Type字体是Windows操作系统所采用的唯一文字标准。它能够简单便捷地将文字轮廓转换成曲线,可以直接根据曲线轮廓加以文字填充,构成各种不同的色彩图案和文字效果,所以它常常被用作一种标题文字或者花样字。

而ttf文件实质上也正如一个集装箱,每种True Type字体包含于单个ttf文件中。其文字目录中包含记载着所有文字格式文件的版本号文件和几个表,各个表上又各自存储记载着所有不同形式的文字逻辑记录,包括最基本的图元中的数据、字距的调整和信息文字、与图元之间的映射等。

字体设计是针对一个参考网格设计的,该网格被称为em-square,网格中的坐标系可以表达文字中的图元。所以,em-squrare大小直接定义了文本中所有图元被缩放的方式。True Type字体对网格调节的要求可体现在控制值表中。例如,对于需要设计的文字来说,字体长度、字体笔画的长度,都可以是被限制的数值。

(四)字体内容的呈现方式

在计算机中,为完成对汉字信息的存储、传递和检索等一系列操作,需要采用到一个名为汉字内码的机内代码。计算机通过键盘键入接收到字体信息后,会由汉字操作系统的“输入码转换模块”将其信息转换成机内代码。不管何种的汉字系统和录入方法,都要先经过电脑的转化成为机内代码,才能对其信息加以贮存和处理。在转化成为机内代码之后,计算机再利用汉字字模码用点阵的方法对汉字的字形进行塑形。这种点阵方法就如一个个黑白方块,用黑色对所需方块加以填充,从而得到字形,所以简而言之汉字字模码也就是汉字的输出形态。针对各种汉字的输出条件不同,其相应的点阵多少也会有所不同,如“一”“二”等简易型汉字可用16*16点阵,而随着汉字笔画及其复杂程度的提升,点阵的规模也会随之扩大。字体库中保存了所有字体的点阵代码。在显示器输出文字时,电脑才会去检查字库,输出字模点阵以得到正确的字形。

二、个性化软件的设计

(一)软件概述

“字游”,顾名思义,是一场字体的畅游,是不同手写字体之间的一次碰撞。同时,与“自由”谐音,包含对其字体流通的自由自在,不受拘束的美好愿景。

“字游”是一款致力于用户的个性需求,让手写字体能够在电子设备上展示的APP。APP能清晰全面地展示手写字体,让用户体验学习他人的字体。通过网络实现个人字体在互联网中的流通从而带动文化传播,增强民族自尊心、自信心。同样,文字是文化的根,行书的美观,楷书的实用,草书的张狂,都能表现出很强的主观精神,具有很强的综合性。

(二)软件特色

“字游”APP采用两种字体录入方式。其一是用户用手指在手机屏幕上直接绘制字体,其二是通过拍照的方式,对纸张上的字体进行捕捉。自助式制作属于自己的字体,能够为用户带来与众不同的体验。

“字游”APP主要设计有三种模块,即登录模块、个性造字模块及我的字库模块。登录模块的主要功能是用户的注册,登录和退出登录;个性造字模块主要用于创建字库,同时完成对个人即将创建的字体进行描述,为个人字体取名等操作。其中有两种字库可供用户选择,分别是常用字库和国标字库,前者包含大部分简单字体,可满足常用字体的录入,后者的字库则较为完备。在我的字库模块中,用户能够看见个人创建的所有字库,并可对其进行删除、继续书写和改写等一系列操作。

以下是部分操作界面展示:

图1 创建字库界面

图2 书写界面

三、个性化字体的实现

(一)实现的主要原理

“字游”希望实现的功能,是将手写汉字通过拍摄得到的图形替换本机字体,实现“抠字”功能,就类似于将图片进行抠图处理。各类图片实质上是用不同色块像素拼接而成,我们需要抠下其中的有效色块。打个比方,将0~255对应成黑白色块的颜色深浅程度,“0”代表黑色,“255”代表白色,中间的数字则代表由0至255颜色逐步递减的色块。将需要进行“抠字”处理的图片进行色差调节,此时的图片只有黑白两色,利用脚本将黑色像素的保留,可得到字体的轮廓。

为实现“抠字”功能,还需要一定的环境要求,为保证字体质量,需要在适合的光亮和淡色的平滑纸张上进行书写拍摄,手动书写的汉字也要尽量匀称,否则字体可能出现断断续续的情况。此外,通过“抠字”得到字体还需进行字体比例、位置的调节。少了这项操作,展示在我们眼前的文字会东倒西歪,甚至不在一条直线上。在ttf文件中记录了每个字体的比例。故按照默认字体的字体比例进行调节可以很好地解决这一问题。

手绘字体的原理在于用Android屏幕进行手写签字的过程中,其实际是将手机触摸屏视为画板,将用户指尖当作画笔,指尖可置于手机触摸屏上进行滑动,触摸屏上将会自动呈现用户指尖移动的轨迹,类似于用画笔在一个画板上绘画的效果。

机器中字体替换的功能本质上是ttf文件的默认字体权限的更改。因此,将经过处理后得到的所有图片集合转换为ttf文件,再将其权限修改为默认字体即可。

(二)实现的关键技术

字体输入的实现应与输入法相关联。一个输入法的核心类为InputMethodSe rvice,候选字的显示以及汉字的上屏等所有逻辑功能均使用该服务来完成。我们能够通过Keyboardview方式或者Keyboard对象来完成单一的按键布局格式。KeyboardView同时也是一种真空的view,它的布局是不可预见的,但它的代码含有一个名为Keyboard的辅助类成员,它能够承担相应的按键布局,包含了中英文键盘、数字和符号按键等,把布局上的按钮与键盘系统内部的KeyCode对应出来,通常我们在建立Keyboard的时候可以直接添加xml文档。

Android手绘字体的实现,首先,要选取某个屏幕尺寸的bitmap为底图,并设定为全透明色。其次,将整个canvas内置于bitmap上,把触控点击事件作为paint即可。具体操作步骤为:获取当前屏幕的长和宽,获取布局和button,并写出点击事件,设置画图相关的bitmap、canvas、paint等,再写点击事件。最后,加载一个view,并再加上一个新的button,点击取消标记即可。

具体关键代码如下:

drawView=new DrawView(this,windowHeight,windowWidth);//通知view组件重绘

drawView.invalidate();

rl.addView(drawView);

btnn=new Button(this);

btnn.setText("new button");

RelativeLayout.LayoutParamsbtnpara=newRelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);

btnpara.addRule(RelativeLayout.CENTER_HORIZONTAL);

btnpara.addRule(RelativeLayout.CENTER_VERTICAL);

rl.addView(btnn,btnpara);

btnn.setOnClickListener(new View.OnClickListener(){

@Override

public void onClick(View v){

rl.removeView(drawView);

rl.removeView(btnn);

}

结语

这时我们会想:“为什么不能只替换自己经常用到的几个字体呢?”事实上不能篡改Microsoft上的字体,这样可能会涉及版权问题。为了避免这一问题的发生,我们需要创造出属于自己的一套字库。GB2312字符编码可以表示6763个汉字,就算只采用现今的常用字库也有3600余字,如果只是逐一输入,还要保证对每个字体的满意程度,这会是一个耗时耗力的工程,也是现今个性化字体类软件不得不面对的一个共同难题。我们不禁联想,是否可以开发出一种“自动学习”的功能,只获取到用户提供的偏旁部首,而后再去拼装成一个完整的汉字。相信如此,录入字体的工作量会大大减轻。

猜你喜欢
字库字符字体
No.2 喜茶联合汉仪字库推出微型书和书签
字体的产生
字符代表几
一种USB接口字符液晶控制器设计
HBM电子称与西门子S7-200系列PLC自由口通讯
消失的殖民村庄和神秘字符
论计算机字库单字的著作权保护
——以方正诉宝洁案为例
老家的惜字库
组合字体
再议字库知识产权保护