最近boss要出这么一本书,不,一本字帖。起因是他在咖啡店邂逅一文艺女子,女孩写得一手莹莹小楷。哦,后来的事,就容易猜得到了。
这本书大概就是几十首诗词,赏诗弄笔,自是逼格满满。
于是一个坑中漫步的故事就开始了。
过程大概是这样的
1.她把诗写在纸上
2.扫描提线即可
看,多么简单。
但是,居然,竟然,写的大小以及版式和最终排版的并不相同……并不相同是什么意思?
意思是——操作每一个字,oh,shit
于是我统计了下诗词的总字数,大约3000字。3000算什么,哥PS+AI双管齐下,运指如飞……
可是boss觉得,这么好的文字,就应该写两遍。另一个原因是——一遍篇幅不够,显薄
我……(你说的好有道理)
还有,架不住boss生性多变,万一,不对,是肯定会修改。
于是,一个合理的方案是,把这姑娘的字变成——字体。
理由显而易见:一是应对多样修改。而是可以挑选作者最稳定的字形重复使用。
作为从业多年的老司机,字体,多么熟悉又陌生。
正(bei)文(keng)开始:
统计下需要做多少个字
打开Indesign,grep 查找~k,更改 $0\r 把所有字变成单字单行,copy进excel 全选-数据-删除重复项,居然只有1000个字,啧啧,这个方向好
优雅的打开fontCreator(对,貌似是多么牛逼的软件,幻想着boss那无比赞叹的表情)为了方便对照调整,找一款现有的楷体字体作为模板。
ps选区——ai实时描摹——复制——fontCreator 查找字形 ——打开——粘贴——调整大小
一切看似顺利,但速度出奇的慢,因为我在不停的切换……
我的人生信条是:一切重复的劳动应该让计算机来做!
哥可是python爱好者(爱好者——水平差,脑洞大)
我的思路是这样的:
扫描图片
把所有的字单字导出
按照每个字的图片重命名文件名
全部描摹
按文件名用合适的程序依次替换
生成字体
扫描图片
由于扫描并不能保证每一张纸的角度没有偏差,因为我给画的框线在最外面有还有一个外框,可以用ps的裁剪并修齐照片预先批处理一下扫描图片,会纠正倾斜,并把图片都裁切到一致大小。
单字导出
单字导出不难,最初给那姑娘的纸上有做好的格子。直接AI,每个字建立一个画板不就好了么
然而我成为了第一个知道illustrator最多能建立多少个画板的人。Oh,shit,一张纸300个格子,但是ai只能建立105个画板。这很adobe。
比较幸运的是,这是古诗,所有的古诗大多写在中间的位置,再加上百分之三百的冗余。我用手指算了下最终覆盖90%的汉字。恩,还算圆满。
即便如此,还是有很多空白的格子被导出了。刚开始我是一个个手动删除的。结果进行到一半的时候,同事过来撇了一眼,“如果能有个区分图片重量的方法就好了”
我正准备朝下他的无知:“笑话,哪有这种逆……天……的——————————卧槽!重量不就是图片大小么”。“你很牛逼!”
果然,按照图片大小排序后,所有的空图片全落在最后,额呵呵。不错!
命名文件名
刚开始我想了个绝好的办法,用开源的tesseract-OCR,结果先用了带有gui的做测试,结果渣到爆,遂放弃,毕竟手写字体么,后来我想,也许正是因为OCR在一个相当大的范围里去分析图形才导致这个识别率太渣,因此我又换了个思路:
我找到一个叫pyssim的统计图片相似度的包。然后把统计好的字在indesign里用数据合并做成和这些单字同样的图片,字体采用已有对照的硬笔楷体。
然后拿导出图的每一个依次跟扫描好的单字比较,相同的字肯定相似度最高,我还在一个小范围里做了测试,结果很让人振奋,相似度看似可行,然后将程序在3000个字图中比较,结果悲催了,首先是速度奇慢,再就是结果太不准确了,如此算来,加上已经浪费的调试时间,还不如人肉识别重命名,oh shit。
可是批量重命名可能无法避免多余的操作。我找到了比较好的快捷键,额至少也算一种简便的方法: F2+tab 几乎不浪费每一次键入。果然比识别还快,可惜就是有点闷。
全部临摹
用虚拟机virturalbox安装一个ubuntu的发行版。
相信我,linux比win干这种事爽上一千倍。具体如何虚拟机和主机之间共享文件和双向剪切之类的就不说了,那是另外一个话题。一切准备妥当后
打开终端 安装几个软件。
sudo apt-get updatesudo apt-get install ImageMagick potrace
ImageMagick相当于命令行版的ps,potrace命令行工具用来对位图进行描摹,速度都比adobe快很多。
批量改格式
假如你用ai导出的图片格式时jpg时,你可以
mogrify -format bmp -resize 283x283 *.jpg
然后在右字图的文件夹下打开另一个终端(方便起见,大牛可自行cd)
potrace -s -a 1.334 *.bmp
就是这么的简单,就是这么的粗暴,就是这么的迅速,大约1秒左右,全部字图的svg均已描摹生成。
不要问我为毛有个1.334的参数,资料在此Potrace -alphamax 1.334 (or the limit between artificial and natural)
我也没看太明白。
最后出场的是重量级软件 fontforge
他是神一样的存在,有了这个软件,什么fontlab,fontcreator都弱爆,因为fontforge是开源的字体编辑软件,在ubuntu下面在安装fontforge后,系统会建议你安装 fontforge-python,这个是整个过程的重中之重。
sudo apt-get install fontforge fontforge-python
个人非常喜欢python的notebook,适合像我这种爱好者折腾。
import fontforge
import psMat
import os
#设置fontforge源文件的路径
font = fontforge.open("xxx.sfd")
#设置字体svg文件存放的路径
source_path="/home/xxx/svg"
def choose_svg(the_path):
my_fonts=[]
for the_file in os.listdir(the_path):
font_name=the_file.split('.')[0]
if len(font_name)<=3:
font_name=font_name.decode('utf-8')
svg_path=the_path+"/"+the_file
try:
g=font[fontforge.nameFromUnicode(ord(font_name))]
except:
g=font.createChar(ord(font_name))
g.clear()
print font_name
g.importOutlines(svg_path.decode('utf-8'))
g.correctDirection()
#设置字体的坐标值
px=-35
py=-10
#设置字体的缩放
MATRIX1=psMat.scale(1.3)
MATRIX2=psMat.translate(px,py)
g.transform(psMat.compose(MATRIX1,MATRIX2))
g.simplify()
g.round()
g.width=256
my_fonts.append(g)
return my_fonts
mobfly_fonts=choose_svg(source_path)
font.save()
font.generate("shouxie.ttf")
字体生成了,你觉得你成功了,图样图森破!!!!!!
然后,我告诉你经过以上步骤生成的字体问题很多,决不可用,被骗了有木有,傻了有木有 哦呵吼哈。最重要的问题是 字体的位置和大小均不够理想,原因是
当初扫描的时候,甚至在手写的时候,对每个字的位置和大小把控不严,导致后续字体大大小小,东倒西歪。
每个字体四周都有以前扫描留下来的黑线。
potrace虽然描摹速度极快,而且我们也对其平滑参数做了最好的调校,可是描摹出的路径依旧坑坑洼洼(这也与最初写字的纸张粗糙有关。普通70g复印纸)跟其他字体质量相差甚远。
所以要解决以上两个问题,就得重新拾起我们的ps和ai商业软件的优势就是在于能够胜任商业输出
用ps矫正字图的黑线和偏移
难道还是ps?难道要一个一个调整?
当然不是,我的方法是 两次高斯模糊+两次阈值+选区法
第一次模糊+阈值:运用高斯模糊屏蔽整个画面中相对细,小,灰的部分。阈值后通道里alt+左键建立选取,填充白色。黑线,噪点之类统统不见了。
第二次模糊+阈值:运用高斯模糊使得结构分离的笔画重新连接在一起,而后阈值,从通道做选择。新建图层,全选,居中……
如你所见,我并没有用鼠标在画布上做任何的选取,取而代之的是用通道做选区。这样的好处是,可以把整个过程变成动作,然后批处理之……我都被我的机智感动了……
下面是插图版
当然,这个方法也有需要注意的,最好多调整几次,找到最好的模糊和阈值的选取。即便如此,估计也有两三个逆天的汉字由于比划距离太短而出现比划消失的现象,呵呵,毕竟不多,再手工改回来便是。
用AI矢量化
ai就是好哇,ai矢量描摹出来的比划整体要比potrace出来的细腻的多。该凸凸,该俏俏。所以说商业软件才是生产力,开源的固然牛逼得飞起,但质量上,还是差那么一点点。
ai也有批处理!
本来不用多说什么,记录动作,然后批处理,啧啧,没想到ai也有坑,potrace描摹的结果是背景透明的,但ai的居然不行,它会保留白色。别跟我说ai的矢量描摹也可以设置成背景透明。ai在批处理模式下只会进行默认的设置。当然,你还可以编写脚本。但是不够机灵是不是。
怎样才能让ai批处理透明背景呢,答案是在动作里添加 选择相同颜色。ai在默认没有任何选区的状况下,会选择和左侧工具栏 填色框里相同的颜色。(这个问题困扰了我半个晚上)保险起见,可以多一个设置填充颜色为白色的动作。
批处理的精髓在于不要做任何选择。
好了,这次处理好的svg文件再次fontforge之,是不是比之前好了许多。但是,但是~~~~~~你可能有隐隐的感觉,造字才不会这么简单!
我估摸着,当字体在设计之初,他们会整体上做统一考虑。这个时候的字体排出来怕是还有点高高低低的死板,于是,我的想法是,继续借鉴已有的硬笔字体设置。把字体参照已有的商业字体的缩放和位置调整,这个通过fontforge可以实现,不过毕竟这玩意要出版,我选择了把另外的字体变成背景,在fontforge里手工单个调校。
代码如下
import fontforge
#设置源字体文件的路径
font = fontforge.open("xxx.sfd")
#设置对照字体文件的路径
font_copy = fontforge.open("path/to/copy.sfd")
print font_copy
# print font
#替换你要对照的字体
the_str=u'翁山慰稽鸡看能鸣溅深建'
def change_font(my_str):
for char in my_str:
try:
print char
g=font[fontforge.nameFromUnicode(ord(char))]
g_copy=font_copy[fontforge.nameFromUnicode(ord(char))]
g_copy.export('tmp.bmp')
g.importOutlines('tmp.bmp')
except:
print char+'not found'
change_font(the_str)
font.save()
font.generate("shouxie3.ttf")
font.close()
print "finish"
总结
首先,这并不算一个专业的指导,只是辛苦一阵,做个记录。
然后,强烈推荐fontforge,献给所有爱折腾的人。
最后,造字并不是这样造的~~~~~~~~早知道!!!