原文来自 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相关推荐

  1. 36.centos 安装文泉驿字体

    2019独角兽企业重金招聘Python工程师标准>>> ####################### 在使用Firefox浏览网页时,黑色的字体老感觉好淡,看不清,网友对文泉驿字体 ...

  2. linux 文泉驿正黑字体,文泉驿字体系列打包下载-文泉驿字体下载-西西软件下载...

    文泉驿字体是一套免费开源的字体,现在的很多设计师在设计商业产品时总是要考虑字体版权问题,而商业字体的授权价格昂贵让很多人望而却步.这里西西推荐的这套文泉驿字体是开源字体,比较常用语linux系统中,大 ...

  3. linux文泉驿字体调用,使用文泉驿点阵字体解决Linux中文化问题

    文泉驿点阵中文字体可以在wqy.sf.net下载,提供9pt-12pt字号的点阵中文字体,字型很美观的,可以与windows下的宋体媲美.下载完毕,把 文泉驿点阵中文字体可以在wqy.sf.net下载 ...

  4. 安装最新的文泉驿字体[z]

    打开终端,执行以下命令,或使用<新立得软件管理器>,在其中搜索"xfonts-wqy"并标记安装. sudo apt-get install xfonts-wqy 让系 ...

  5. Ubuntu 14.04 64位字体美化(使用文泉驿微黑)

    Ubuntu 14.04安装并升级之后,变成楷体字体非常难看,我昨天搞了一晚上,终于理了个头绪,这里整理一下. 经过网上调研,大家的一致看法是,使用开源字体库文泉驿的微黑字体效果比较理想,甚至效果不输 ...

  6. 困扰许久的文泉驿显示慢问题终于解决了

    前言:很久没写了.5月忙着申请Google Summer of Code,六月忙着申请实习,现在忙着实习,果然,blog只有闲着的时候才能写-- 现在在 北京千橡实习中,做ATL/WTL,一切都还算顺 ...

  7. python 时间序列预测_使用Python进行动手时间序列预测

    python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...

  8. python 概率分布模型_使用python的概率模型进行公司估值

    python 概率分布模型 Note from Towards Data Science's editors: While we allow independent authors to publis ...

  9. ubuntu9.10安装文泉驿微米黑字体

    1. 安装文泉驿微米黑字体: sudo aptitude install ttf-wqy-microhei 2. 修改字体选择文件/etc/fonts/conf.d/69-language-selec ...

  10. linux显示点阵字体,使用文泉驿点阵字体解决Linux中文化问题

    文泉驿点阵中文字体可以在wqy.sf.net下载,提供9pt-12pt字号的点阵中文字体,字型很美观的,可以与windows下的宋体媲美. 下载完毕,把所有pcf.gz文件解压至~/.fonts/,然 ...

最新文章

  1. perl 分析mysql binlog
  2. 知识图谱实践篇(五):KBQA Demo
  3. 微信支付退款结果通知解密 base64_decode / md5 / AES
  4. 前端开发必备!Emmet使用手册
  5. 使用 ESS SDK 快速创建多实例规格伸缩配置
  6. 本特利3500_3500系统轴振信号异常波动问题浅析及建议
  7. python数据分析用什么库_Python数据分析常用的库总结
  8. 通通玩blend美工(1)——荧光Button
  9. 计算机绘图国标规定,机械制图教程(1.1)国家标准关于制图的一般规定
  10. Windows中解压Linux中产生的tar.gz分卷压缩包
  11. WebCrack:一键自动化日站工具 ——yzddMr6
  12. #1.生活小妙招-联想小新潮7000电脑摄像头打不开
  13. 树莓派添加开机自启动
  14. 跨境电商shopee这个平台怎么样?百万shopee卖家笑了,不要再犹豫了
  15. C primer plus 复习题答案(上)
  16. 神舟战神g8r9和g9r9区别对比评测选哪个好
  17. 多图详解:解决onenote英文输入自动切换字体为calibri
  18. Ubuntu18.04安装RTL8125/RTL8168等网卡驱动程序
  19. 在Ubuntu 10.04中安装 insight
  20. AccessViolationException

热门文章

  1. 3D建模与处理软件简介
  2. 小红伞杀毒软件|小红伞杀毒软件下载
  3. displaytag 使用
  4. linux 终端命令字体大小,如何更改Ubuntu终端的字体和字体大小
  5. spring boot 集成 sitemesh
  6. 自己给打印机怎么加粉墨,联想兄弟打印机加粉步骤
  7. 刷淘宝流量软件推荐 免费刷淘宝流量软件优缺点
  8. html答题游戏代码,html5+css3+ajax手机端脑筋急转弯答题游戏代码
  9. 线性代数(六)正交性
  10. less最后一页 linux_linux中less命令使用