话不多说,先上代码!

Python
from PIL import ImageFont,Image,ImageDraw


def image_get(character,font_path,font_size=32,pad=10):	# 根据字体文件渲染出指定字符的图像
	font = ImageFont.truetype(font_path,font_size)					# 加载 truetype font,即 ttf 文件
	left,top,right,bottom = font.getbbox(character)					# 获取相应字符在字体文件中的字形坐标信息
	char_width = int(right - left)
	char_height = int(bottom - top)
	canvas_width = char_width + pad*2
	canvas_height = char_height + pad*2
	canvas = Image.new('RGB',(canvas_width,canvas_height),color='white') # new一个 RGB 通道的指定长宽的纯白“画布”
	draw = ImageDraw.Draw(canvas)														# 创建一个与“画布”绑定的“画笔”对象
	draw.text((pad-left,pad-top),character,font=font,fill='black') 		# 在画布上绘画出一个字形使其位于“正中心”,填充颜色为黑色
	return canvas # 返回“画布”

整体结构规划

如图所示,红色框的部分是我们配置中的字形占位框长、宽的部分,字形通常是不规则的图案,因为不规则图案安排困难,所以在相关编辑中,字形占位往往是一个矩形。加上指定的padding大小,这就是我们对整张画布canvas的初次规划。

预期结果

如图所示我们希望文字的占位框按规划的那般与红色框重合。

接下来不得不提到有关于字形结构定位的东西了,这里的定位也是采用坐标系,但关键在于“字形原点”的位置。如图所示:

字形结构的定位

额,我们知道字形的占位框是个矩形,但其实有个很尴尬的点就是,字形的坐标系定位中,“字形原点”的位置往往不在占位框左上角的那个点上。就我举得这个例子而言,通过 font.getbbox 获取的 left、top、right、bottom 分别是:0、16、128、121 ,因为水平向右以及垂直向下为正方向,所以 left = 0 表示占位框左边界到 y 轴的垂直距离为0, top = 16 表示占位框上边界到 x 轴的垂直距离, right、bottom 同理。其中正值代表边界框在正方向,例如假设 top = -16 ,也表示占位框的上边界框距离 x 轴的距离为 16 ,但是此时上边界在负方向,也就是上半部分,其余同理 。

注意以上讨论的坐标是以“字形原点”为基础建立的,此时坐标原点是”字形原点“。

此时我们再回头去看 “draw.text((pad-left,pad-top),character,font=font,fill=’black’)” ,其中 参数 “xy = (pad-left,pad-top)”,这里的 “xy” 参数指定的是 “字形原点”(origin)的位置,字形原点在“画布”中的位置决定了占位框在“画布”中的位置,相对的我们可以反过来提前定位“占位框”的位置反推出“字形原点”的位置。

我们现在放眼整个画布,坐标原点是在整体的左上角,此时我们假设字形原点的坐标为 (x_0,y_0) 因为 left = 0 ,并且 占位框的左边界在 x=pad ,pad-x_0=left ,所以 x_0 = pad ;因为 top = 16 ,占位框的上边界在 y = pad , pad-y_0 = top ,y_0=pad-top 。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

作者

3049874370@qq.com

相关文章

字体混淆加密

之前因为要研究“某通”的“科学学习”程序,研...

读出全部