微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我希望实现几个功能,以增加我的程序的输出.
我想将一列文本的背景设置为某种颜色,以便它
更清楚的是列属于一起.

一张图片胜过千言万语:
我想转换这个:

Pos.  :123456789012345
Name. :ABCDEFGHIJKLMNO  
Str.  :SOMESTRINGSOMET  <---- indented by half a row,Column number superscripted
Str.  :SOM       SOMET
Str.  :SOMESTRIN    ET

对此:

我怎么能用python做到这一点?是否有一个框架可以让我这样做?
我把它转换成了乳胶,但我不能让上标数字起作用.它们需要在文本之上,但不能充当角色,因为图片的列之间存在关系.

Example: A is at position 1. It has as Properties S and O,thats why it is on top of those two and that is why there is an indent of half a character. S has the superscript 170,T has the superscript 185.

特别难的也是Str部分被半个字符移动的部分.我想有一个例子可以集成到我的程序中.

解决方法

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

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])

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


我最近重新拾起了计算机视觉,借助Python的opencv还有face_recognition库写了个简单的图像识别demo,额外定制了一些内容,原本想打包成exe然后发给朋友,不过在这当中遇到了许多小问题,都解决了,记录一下踩过的坑。 1、Pyinstaller打包过程当中出现warning,跟d
说到Pooling,相信学习过CNN的朋友们都不会感到陌生。Pooling在中文当中的意思是“池化”,在神经网络当中非常常见,通常用的比较多的一种是Max Pooling,具体操作如下图: 结合图像理解,相信你也会大概明白其中的本意。不过Pooling并不是只可以选取2x2的窗口大小,即便是3x3,
记得大一学Python的时候,有一个题目是判断一个数是否是复数。当时觉得比较复杂不好写,就琢磨了一个偷懒的好办法,用异常处理的手段便可以大大程度帮助你简短代码(偷懒)。以下是判断整数和复数的两段小代码: 相信看到这里,你也有所顿悟,能拓展出更多有意思的方法~
文章目录 3 直方图Histogramplot1. 基本直方图的绘制 Basic histogram2. 数据分布与密度信息显示 Control rug and density on seaborn histogram3. 带箱形图的直方图 Histogram with a boxplot on t
文章目录 5 小提琴图Violinplot1. 基础小提琴图绘制 Basic violinplot2. 小提琴图样式自定义 Custom seaborn violinplot3. 小提琴图颜色自定义 Control color of seaborn violinplot4. 分组小提琴图 Group
文章目录 4 核密度图Densityplot1. 基础核密度图绘制 Basic density plot2. 核密度图的区间控制 Control bandwidth of density plot3. 多个变量的核密度图绘制 Density plot of several variables4. 边
首先 import tensorflow as tf tf.argmax(tenso,n)函数会返回tensor中参数指定的维度中的最大值的索引或者向量。当tensor为矩阵返回向量,tensor为向量返回索引号。其中n表示具体参数的维度。 以实际例子为说明: import tensorflow a
seaborn学习笔记章节 seaborn是一个基于matplotlib的Python数据可视化库。seaborn是matplotlib的高级封装,可以绘制有吸引力且信息丰富的统计图形。相对于matplotlib,seaborn语法更简洁,两者关系类似于numpy和pandas之间的关系,seabo
Python ConfigParser教程显示了如何使用ConfigParser在Python中使用配置文件。 文章目录 1 介绍1.1 Python ConfigParser读取文件1.2 Python ConfigParser中的节1.3 Python ConfigParser从字符串中读取数据
1. 处理Excel 电子表格笔记(第12章)(代码下载) 本文主要介绍openpyxl 的2.5.12版处理excel电子表格,原书是2.1.4 版,OpenPyXL 团队会经常发布新版本。不过不用担心,新版本应该在相当长的时间内向后兼容。如果你有新版本,想看看它提供了什么新功能,可以查看Open