python格式化文本_如何在Python中格式化文本,就像在Illustrator中一样?

这篇博客介绍了一种使用Python的PIL库来创建带有下标和灰度背景列的多行文本的方法。通过调整字体和位置,实现了在特定位置上显示下标,同时展示了如何生成和绘制这些效果。代码示例详细解释了整个过程,适用于需要在文本中添加复杂格式的情况。

有可能提出棘手的解决方案,考虑单声道间隔字体,可以解决您的问题.但他们只是等着失败.您帖子中的灰色列可以完全按照图中的颜色添加,但我选择不改变字母中的颜色(因为我发现它更具可读性).

PIL可以提供以下内容:

略微改变字体:

接下来会有更“严重”的字体更改,所有字体都按原样生成.

接下来是生成这些数字的代码.我并没有真正做到这一点,它可以在很多方面得到改善.将此视为您需要做的事情的一个示例,可能会为您的问题找到解决方案.要使用任何类型的字体,您需要一个实际的排版系统,例如LaTeX.

import sys

import Image,ImageDraw,ImageFont

# Assumption: some other piece of code separates the data in the following

# format.

line1 = [("Pos. :",0),("123456789012345",0)]

line2 = [("Name. :",("ABCDEFGHIJKLMNO",0)]

line3 = [("Str. ",(":",-0.5),("SOMESTRINGSOMEST",-0.5)]

line4 = [("Wave 1:",("_XXXX_X____X_X_",0)]

line5 = [("Wave 2:",("__XX_XXX_X__X_X",0)]

line_data = [line1,line2,line3,line4,line5]

# Texts to draw over the last element,in specific positions,# of lines present in line_data.

subscript = {

2: { # Meaning: third item in line_data

0: "170",# Meaning: draw "170" over the first char

len(line3[-1][0]) - 1: "185",# Draw "185" over the last char

7: "180",# Meaning: draw "180" over the eight char

},4: {5: "hi"},3: {6: "ops"}

}

# If the following fonts are not mono spaced,you are going to suffer.

#

# Normal font.

font = ImageFont.truetype('FreeMono.ttf',40)

# Font for subscript.

font_tiny = ImageFont.truetype('FreeMono.ttf',20)

im = Image.new("RGBA",(1000,1000),'white')

draw = ImageDraw.Draw(im)

line_offset = 4

start_y = 6

width_A,height_A = font.getsize('A')

_,height_tiny_A = font_tiny.getsize('A')

# Collect even columns from the last item of list line1.

even_columns = []

x = 0

for i,(text,_) in enumerate(line1):

for j,letter in enumerate(text):

if i == len(line1) - 1 and not j % 2:

even_columns.append(x)

x += width_A

# Write all lines.

width = 0

l_start_y = start_y

for di,data in enumerate(line_data):

x = 0

for i,xoff) in enumerate(data):

for j,letter in enumerate(text):

# Apply x offset.

extra = width_A * xoff

draw.text((x + extra,l_start_y),letter,font=font,fill='black')

x += width_A

width = max(x,width)

l_start_y += height_A + line_offset

# Collect letter positions from the lines that will have subscripts.

letter_pos = {}

for k in subscript:

letter_pos[k] = {}

x = sum(len(text) for text,_ in line_data[k][:-1]) * width_A

text,xoff = line_data[k][-1]

for i in range(len(text)):

extra = width_A * xoff

letter_pos[k][i] = x + extra

x += width_A

# Write all subscripts.

for k,v in subscript.items():

line = line_data[k]

for pos,text in v.items():

x = letter_pos[k][pos]

y = start_y + (line_offset + height_A) * k

y -= height_tiny_A * 0.4 # XXX A poor heuristic that worked here.

draw.text((x,y),text,font=font_tiny,fill='black')

width = max(width,int(x + font_tiny.getsize(text)[0]))

# Draw grey columns.

columns = Image.new(im.mode,im.size,'white')

mask = Image.new("L",'white')

for x in even_columns:

columns.paste((128,128,128),(x,line_offset,x + width_A,l_start_y))

mask.paste(164,)

im = Image.composite(im,columns,mask)

# Crop and save the resulting image.

im.crop((0,width,l_start_y + 2)).save(sys.argv[1])@H_403_8@

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值