用于将文本创建为位图的工具(抗锯齿文本、自定义间距、透明背景)
我需要批量创建带有文本的图像。 要求:
- 任意大小的位图
- PNG 格式
- 透明背景
- 黑色文本 抗锯齿透明度
- 可调字符间距
- 可调文本位置(文本开始的 x 和 y 坐标)
- TrueType 和/或 Type1 支持
- Unix 命令行工具或 Python 库
到目前为止,我已经评估了以下内容:
- Python 成像库:失败 5.
- ImageMagick(“标题”选项):很难弄清楚 6.
- PyCairo:失败 5.
- SVG + ImageMagick 转换:最有前途,尽管需要多种工具
PIL 的问题在于,例如Verdana 太稀疏了。 我需要文本更紧凑一些,但是在 PIL 中没有办法调整它。
在 ImageMagick 中,我还没有找到一种简单的方法来指定图像中文本的开始位置(我使用 -size WIDTHxHEIGHT 和标题:'TEXT')。 添加透明边框会将文本移离它所固定的角,但
- 图像大小需要相应调整,因为边框会增加一定范围,
- 无法独立调整水平和垂直偏移
我是否错过了一些明显的替代方案或未能找到上面提到的必要功能?
I need to batch create images with text. Requirements:
- arbitrary size of bitmap
- PNG format
- transparent background
- black text anti-aliased against transparency
- adjustable character spacing
- adjustable text position (x and y coordinates where text begins)
- TrueType and/or Type1 support
- Unix command line tool or Python library
So far I've evaluated the following:
- Python Imaging Library: fails 5.
- ImageMagick ("caption" option): hard to figure out 6.
- PyCairo: fails 5.
- SVG + ImageMagick convert: most promising, although requires multiple tools
The problem with PIL is that e.g. the default spacing for Verdana is way too sparse. I need the text to be a bit tighter, but there's no way to adjust it in PIL.
In ImageMagick I haven't found an easy way to specify where in the image the text begins (I'm using -size WIDTHxHEIGHT and caption:'TEXT'). Adding a transparent border will move the text away from the corner it's achored to, but
- image size needs to be adjusted accordingly since border adds to the extents
- it's not possible to adjust horizontal and vertical offset independently
Have I missed some obvious alternatives or failed to find necessary features from the above mentioned?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
(5) 确实看起来很棘手,缺少在字符串中插入虚拟窄空格(这会破坏字距调整)或使用更高级别的东西,如 SVG 或 HTML/CSS 渲染器。
然而,如果您不介意亲自动手,那么破解 PIL 的 freetype 渲染器来添加水平空间看起来很容易。 请参阅_imagingft.c; 在 font_getsize 和 font_render 中添加以下代码之后:
添加:
首先尝试使用普通整数进行跟踪(根据“>> 6”判断可能相当大); 编译看看是否有效。 下一步是将跟踪值从 Python 获取到 C 函数中,为此您必须将 font_render 中的 ParseTuple 调用更改为:
并在 font_getsize 中:
然后查看您想要的 Python 接口。 这是一个微不足道但相当乏味的案例,通过界面的每个级别添加额外的“跟踪”参数,例如:
我还没有测试过这些! 如果它有效,可能值得作为补丁提交。
(5) indeed looks tricky, short of inserting dummy narrow-spaces into the string (which will break kerning) or using something much higher-level like the SVG or HTML/CSS renderer.
However, if you don't mind getting your hands dirty, it looks quite easy to hack PIL's freetype renderer into adding horizontal space. See _imagingft.c; after the following code in both font_getsize and font_render:
Add:
Try it with a plain integer for tracking (probably quite large judging by that '>>6') first; compile and see if it works. The next step would be to get the tracking value into the C function from Python, for which you would have to change the ParseTuple call in font_render to:
And in font_getsize:
Then look at what Python interface you want. This is a trivial but quite tedious case of adding the extra 'tracking' argument through each level of the interface, for example:
I haven't tested any of this! If it works, might be worth submitting as a patch.
以下是 SVG + ImageMagick 解决方案:
基于此模板以编程方式创建 SVG 文档,将“TEXT HERE”替换为所需的文本内容:
使用 ImageMagick 的
convert
将文档转换为背景透明的 PNG:Here's the SVG + ImageMagick solution:
Programmatically create SVG documents based on this template, replacing "TEXT HERE" with the desired text content:
Convert the documents to background-transparent PNGs with ImageMagick's
convert
:快速浏览一下,Pango 支持 字母间距。 Pango 具有 Python 绑定并与 Cairo 集成。
From a quick glance, Pango has support for letter spacing. Pango has Python bindings and is integrated with Cairo.