代码之家  ›  专栏  ›  技术社区  ›  akaihola dnlcrl

用于将文本创建为位图的工具(抗锯齿文本、自定义间距、透明背景)

  •  4
  • akaihola dnlcrl  · 技术社区  · 16 年前

    我需要批量创建带有文本的图像。要求:

    1. 任意大小的位图
    2. PNG格式
    3. 透明背景
    4. 针对透明度的黑色文本抗锯齿
    5. 可调整文本位置(文本开始处的x和y坐标)
    6. TrueType和/或Type1支持

    到目前为止,我已经评估了以下内容:

    PIL的问题在于,例如,Verdana的默认间距过于稀疏。我需要文本更紧一点,但是在PIL中没有办法调整它。

    • 由于边框会添加到范围中,因此需要相应地调整图像大小
    • 不可能单独调整水平和垂直偏移

    3 回复  |  直到 16 年前
        1
  •  4
  •   bobince    16 年前

    (5) 事实上,除了在字符串中插入虚拟的窄空格(这将打破紧排)或使用SVG或HTML/CSS等更高级别的渲染器之外,这看起来很棘手。

    _imagingft.c ; 在font_getsize和font_render中执行以下代码之后:

    if (kerning && last_index && index) {
        FT_Vector delta;
        FT_Get_Kerning(self->face, last_index, index, ft_kerning_default,
                       &delta);
        x += delta.x >> 6;
    }
    

    加:

    if (last_index && index) {
        x += tracking;
    }
    

    long tracking;
    if (!PyArg_ParseTuple(args, "Ol|il:render", &string, &id, &mask, &tracking))
        return NULL;
    

    和字体大小:

    long tracking;
    if (!PyArg_ParseTuple(args, "O|l:getsize", &string, &tracking))
        return NULL;
    

    然后看看您想要什么Python接口。通过接口的每一级添加额外的“跟踪”参数,这是一个简单但相当乏味的例子,例如:

    def truetype(filename, size, index=0, encoding="", tracking= 0): # added optional tracking
        "Load a truetype font file."
        try:
            return FreeTypeFont(filename, size, index, encoding, tracking) # added tracking
        ...
    
    class FreeTypeFont:
        "FreeType font wrapper (requires _imagingft service)"
    
        def __init__(self, file, size, index=0, encoding="", tracking= 0): # added tracking
            import _imagingft
            self.font = _imagingft.getfont(file, size, index, encoding)
            self.tracking= tracking # add this line
    
        ...
    
        def getmask2(self, text, mode="", fill=Image.core.fill):
            size, offset = self.font.getsize(text, self.tracking) # use tracking
            im = fill("L", size, 0)
            self.font.render(text, im.id, mode=="1", self.tracking) # use tracking
            return im, offset
    

        2
  •  3
  •   akaihola dnlcrl    16 年前

    以下是SVG+ImageMagick解决方案:

    基于此模板以编程方式创建SVG文档,将“此处的文本”替换为所需的文本内容:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE svg PUBLIC
          "-//W3C//DTD SVG 1.0//EN"
          "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
    <svg version="1.0" width="152px" height="50px">
      <text style="font-size: 22px; font-weight:bold; font-family: Verdana-Bold;
                   letter-spacing: -1.3%;">
        <tspan x="10" y="39">TEXT HERE</tspan>
      </text>
    </svg>
    

    使用ImageMagick的将文档转换为背景透明PNG convert :

    $ convert -background none input.svg output.png
    
        3
  •  2
  •   Torsten Marek    16 年前

    一眼望去,, Pango letter spacing . Pango具有Python绑定,并与Cairo集成。