python字体描边_使用 python 将文泉驿字体导出为 fnt 格式的bitmap font
原文来自 BITCA.CN 的【关于低分辨率像素游戏下显示非防锯齿中文 / 汉字的研究】文章
废话少说,直接上代码 调皮的我,被你发现了 ^_^
# -*- coding: UTF-8 -*-
#coding=utf-8
import pygame # Pygame 游戏模块
from pygame import freetype # 处理矢量字库的 Pygame 模块
import codecs # 处理 unicode 所需模块
import json # 输出 json 格式 所需模块
# 保存的文件名称
saveImgFileName = "pixel-hz.png"
saveCharsetFileName = "charset.txt"
saveFntFileName = "pix-font.fnt"
saveConstructFileName = "construct-spriteFont-spaceData.json"
# 等宽部分的字符表
fixWCharset = codecs.open("chinese-words.txt", "r", "UTF-8").read() # 读取3500个常用汉字的表
fixWCharset = fixWCharset + u"哦罹" # 加入常用字中没有的字
# 需要记录宽度信息的字符表
varWCharset = codecs.open("ascii.txt", "r", "UTF-8").read() # 加入常用的 ascii 字符 表
varWCharset = varWCharset + u",。;“”、:?《》" # 加入拳脚的汉字标点
gridW = 14 # 每个字符输出区域的宽度
gridH = 14 # 每个字符输出区域的高度
outColNum = 90 # 每行输出的字符数
outRowNum = 42 # 一共输出的行数
textureW = gridW * outColNum # 最终输出的贴图宽度
textureH = gridH * outRowNum # 最终输出的贴图高度
pygame.init() # 初始化游戏引擎
pygame.display.set_caption("像素点阵汉字生成") # 窗口的标题
screen = pygame.display.set_mode((textureW, textureH)) # 打开的窗口大小
buffer = pygame.Surface((textureW, textureH), pygame.SRCALPHA) # 建立一个透明贴图大小的缓冲区,贴图先
# 因为非等宽字体还要需要处理基线的问题,所以同一个字体载入到两个变量之中,可以进行不同的设置
fixWFont = pygame.freetype.Font('wqy-bitmapsong/wenquanyi_9pt.pcf') # 等宽字符所用字体
varWFont = pygame.freetype.Font('wqy-bitmapsong/wenquanyi_9pt.pcf') # 非等宽字体所用字体
# 关掉防锯齿
fixWFont.antialiased = False
varWFont.antialiased = False
varWFont.origin = True # 使用基线方式渲染字体
varWFontSize = 12 # 非等宽字体的固定输出为 12 像素
baseLine = 10 # 设定从顶部往下 10 个像素为基线
x = 0 # 字符输出的行坐标
y = 0 # 字符输出的列坐标
fontColor = ( 255,255,255 ) # 字体颜色
outlineColor = ( 0,0,0 ) # 描边颜色
charList = {} # 记录所有字符的字典
def addCharObj(code, x, y, xadvance):
charList[code] = {
"x": x,
"y": y,
"xadvance": xadvance
}
for i in range( 0, len(fixWCharset) ): # 遍历常用汉字表
fx = x * gridW # 字符输出的像素坐标 x
fy = y * gridH # 字符输出的像素坐标 y
char = fixWCharset[i]
# 渲染字符描边
fixWFont.render_to( buffer, (fx+1, fy+0), char, outlineColor )
fixWFont.render_to( buffer, (fx+1, fy+2), char, outlineColor )
fixWFont.render_to( buffer, (fx+0, fy+1), char, outlineColor )
fixWFont.render_to( buffer, (fx+2, fy+1), char, outlineColor )
# 渲染字符
fixWFont.render_to( buffer, (fx+1, fy+1), char, fontColor )
# 行列递增
x = x + 1
if (x>=outColNum):
x = 0
y = y + 1
addCharObj(ord(char), fx, fy, gridW)
widthDict = {} # 记录宽度的字典
for enIndex in range(0, len(varWCharset)):
fx = x * gridW # 字符输出的像素坐标 x
fy = y * gridH # 字符输出的像素坐标 y
char = varWCharset[enIndex]
# 渲染字符描边
varWFont.render_to( buffer, (fx+1, baseLine+fy+0), char, outlineColor, size=varWFontSize )
varWFont.render_to( buffer, (fx+0, baseLine+fy+1), char, outlineColor, size=varWFontSize )
varWFont.render_to( buffer, (fx+2, baseLine+fy+1), char, outlineColor, size=varWFontSize )
varWFont.render_to( buffer, (fx+1, baseLine+fy+2), char, outlineColor, size=varWFontSize )
# 渲染字符
varWFont.render_to( buffer, (fx+1, baseLine + fy+1), char, fontColor, size=varWFontSize )
# 记录字符宽度
m = varWFont.get_metrics( char, size=varWFontSize )
lineX = fx + m[0][1]
charW = m[0][1] + 3
if not charW in widthDict : widthDict[charW] = []
widthDict[charW].append( char )
# 行列递增
x = x + 1
if ( x >= outColNum ):
x = 0
y = y + 1
addCharObj(ord(char), fx, fy, charW)
# 输出 construct 3 所需的宽度 json 文件
outputList = []
for wKey in widthDict:
charStr = ""
for char in widthDict[wKey] : charStr = charStr + char
outputList.append( [wKey,charStr] )
outJson = json.dumps( outputList )
print( "Json String For Construct : " )
print( outJson )
file = open( saveConstructFileName, "w" )
file.write( outJson )
file.close()
print( "Construct saved to : " + saveConstructFileName )
# 输出 fnt 文件
outputList = ""
for code in charList:
charStr = ""
info = charList[code]
# for char in charList[code] : charStr = charStr + char
header = 'info face={face} size={size} bold={bold} italic={italic} charset={charset} unicode={unicode} stretchH={stretchH} smooth={smooth} aa={aa} padding={padding} spacing={spacing} outline={outline}\ncommon lineHeight={lineHeight} base={base} scaleW={scaleW} scaleH={scaleH} pages={pages} packed=0\npage id=0 file="{file}"\nchars count={count}\n'.format(
face="pixfont",
size=14,
bold=0,
italic=0,
charset="",
unicode="",
stretchH=100,
smooth=0,
aa=0,
padding="0,0,0,0",
spacing="0,0",
outline=0,
lineHeight=14,
base=baseLine,
scaleW=textureW,
scaleH=textureH,
pages=1,
file=saveImgFileName,
count=len(charList),
)
outputList += "char id={0} x={1} y={2} width={3} height={4} xoffset={5} yoffset={6} xadvance={7} page={8} chnl={9}\n".format(
code, info["x"], info["y"], gridW, gridH, 0, 0, info["xadvance"], 0, 15
)
outJson = header + outputList#json.dumps( outputList )
print( "Json String For fnt : " )
print( outJson )
file = open( saveFntFileName, "w" )
file.write( outJson )
file.close()
print( "fnt saved to : " + saveFntFileName )
# 输出整体字符集文件
charset = fixWCharset + varWCharset
file = codecs.open( saveCharsetFileName, "w", "utf-8" )
file.write( charset )
file.close()
print( "charset saved to : " + saveCharsetFileName )
# 保存贴图文件
pygame.image.save( buffer, saveImgFileName )
print( "texture saved to : " + saveImgFileName )
# 主循环
running = True
while running:
# 在窗口中显示贴图
screen.blit( buffer, (0, 0) )
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
python字体描边_使用 python 将文泉驿字体导出为 fnt 格式的bitmap font相关推荐
- 36.centos 安装文泉驿字体
2019独角兽企业重金招聘Python工程师标准>>> ####################### 在使用Firefox浏览网页时,黑色的字体老感觉好淡,看不清,网友对文泉驿字体 ...
- linux 文泉驿正黑字体,文泉驿字体系列打包下载-文泉驿字体下载-西西软件下载...
文泉驿字体是一套免费开源的字体,现在的很多设计师在设计商业产品时总是要考虑字体版权问题,而商业字体的授权价格昂贵让很多人望而却步.这里西西推荐的这套文泉驿字体是开源字体,比较常用语linux系统中,大 ...
- linux文泉驿字体调用,使用文泉驿点阵字体解决Linux中文化问题
文泉驿点阵中文字体可以在wqy.sf.net下载,提供9pt-12pt字号的点阵中文字体,字型很美观的,可以与windows下的宋体媲美.下载完毕,把 文泉驿点阵中文字体可以在wqy.sf.net下载 ...
- 安装最新的文泉驿字体[z]
打开终端,执行以下命令,或使用<新立得软件管理器>,在其中搜索"xfonts-wqy"并标记安装. sudo apt-get install xfonts-wqy 让系 ...
- Ubuntu 14.04 64位字体美化(使用文泉驿微黑)
Ubuntu 14.04安装并升级之后,变成楷体字体非常难看,我昨天搞了一晚上,终于理了个头绪,这里整理一下. 经过网上调研,大家的一致看法是,使用开源字体库文泉驿的微黑字体效果比较理想,甚至效果不输 ...
- 困扰许久的文泉驿显示慢问题终于解决了
前言:很久没写了.5月忙着申请Google Summer of Code,六月忙着申请实习,现在忙着实习,果然,blog只有闲着的时候才能写-- 现在在 北京千橡实习中,做ATL/WTL,一切都还算顺 ...
- python 时间序列预测_使用Python进行动手时间序列预测
python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...
- python 概率分布模型_使用python的概率模型进行公司估值
python 概率分布模型 Note from Towards Data Science's editors: While we allow independent authors to publis ...
- ubuntu9.10安装文泉驿微米黑字体
1. 安装文泉驿微米黑字体: sudo aptitude install ttf-wqy-microhei 2. 修改字体选择文件/etc/fonts/conf.d/69-language-selec ...
- linux显示点阵字体,使用文泉驿点阵字体解决Linux中文化问题
文泉驿点阵中文字体可以在wqy.sf.net下载,提供9pt-12pt字号的点阵中文字体,字型很美观的,可以与windows下的宋体媲美. 下载完毕,把所有pcf.gz文件解压至~/.fonts/,然 ...
最新文章
- perl 分析mysql binlog
- 知识图谱实践篇(五):KBQA Demo
- 微信支付退款结果通知解密 base64_decode / md5 / AES
- 前端开发必备!Emmet使用手册
- 使用 ESS SDK 快速创建多实例规格伸缩配置
- 本特利3500_3500系统轴振信号异常波动问题浅析及建议
- python数据分析用什么库_Python数据分析常用的库总结
- 通通玩blend美工(1)——荧光Button
- 计算机绘图国标规定,机械制图教程(1.1)国家标准关于制图的一般规定
- Windows中解压Linux中产生的tar.gz分卷压缩包
- WebCrack:一键自动化日站工具 ——yzddMr6
- #1.生活小妙招-联想小新潮7000电脑摄像头打不开
- 树莓派添加开机自启动
- 跨境电商shopee这个平台怎么样?百万shopee卖家笑了,不要再犹豫了
- C primer plus 复习题答案(上)
- 神舟战神g8r9和g9r9区别对比评测选哪个好
- 多图详解:解决onenote英文输入自动切换字体为calibri
- Ubuntu18.04安装RTL8125/RTL8168等网卡驱动程序
- 在Ubuntu 10.04中安装 insight
- AccessViolationException