Python 如何在图片上 添加 带格式的文本?

2017-02-21 21:20:47 +08:00
 xingzhi
使用 PIL 的 text 方法可以加文本,但无法对文本进行格式化,例如调整字符间距等格式。

有没有什么办法可以对图片上的文本进行格式化呢?

谢谢。
3997 次点击
所在节点    Python
11 条回复
Aether
2017-02-21 21:44:45 +08:00
我最开始用的是手动写代码计算(包括换行、行距、字间距等等)。但后来也觉得麻烦。
现在的方案是渲染成网页,然后一个截屏结束。

https://github.com/vbauer/manet

简单高效(如果用得比较少的时候)。
但如果你需要产生很大量的,每一张都不一样的截图,可能还是要考虑自己写代码实现,然后异步调用。

中间有一个坑是中文 font 安装,但填起来问题不大。
Aether
2017-02-21 21:56:54 +08:00
这是两个我生成的图文供参考:



因为是网页,所以网页可以显示成什么样,你就可以生成什么样的图,控制力很强,也不需要写代码。部署完成后需要修改,改改 CSS 重刷就可以试试看到效果。缺点就是每次生成都需要一些时间(配置更好的机器或者资源可能可以提升部分性能) 但生成截图本来都属于大开销,理论上反正都需要异步生成的,所以应该还好。
xingzhi
2017-02-21 23:19:35 +08:00
@Aether
你好,感谢回复。
我目前就是用手动写代码计算的,细调起来特别麻烦。
你说的这个是个很好的办法,实现起来也简单,没必要跟代码死磕。 只是需要多部署一个 web server 来渲染而已。
感谢。
l0o0
2017-02-21 23:46:40 +08:00
可不可以渲染成网页然后转成图片呢。你需要的图片可以当作背景,然后是不是可以修改字体样式了,之后再转换成图片格式
xingzhi
2017-02-21 23:54:38 +08:00
@l0o0
1 楼就是这个意思。 渲染成网页,然后用 PhantomJS 来截图。
l0o0
2017-02-21 23:58:56 +08:00
@xingzhi soga ,原来如此
jimmy66
2017-02-22 00:16:13 +08:00
@Aether 感谢分享~用 Python 图像库生成,字体确实是个比较烦的地方
blueset
2017-02-22 06:57:59 +08:00
顺便借地方提一个问题:
如果需要带 Alpha 通道的图片的话,有什么解决办法码?因为网页截图出来的都是有背景色的。
whnzy
2017-02-22 09:27:00 +08:00
我是通过计算间距来做的,但是一碰上中英文混合就崩溃了。
Aether
2017-02-22 20:11:19 +08:00
@blueset 不是很清楚你具体的场景。比如透明的 png ?这种可能不是需要技术上的方案,而是设计和功能上的整合方案来回避你不想出现的某个结果。
blueset
2017-02-22 20:44:47 +08:00
@Aether 大体上就是需要:
居中排版,文字描边(粗),字体回退,获取实际描画尺寸,透明背景色, Unicode/OTF 额外渲染功能(组合用文字、 ligature 、 Color Emoji 等,非必须)图片格式 PNG 或 WebP 皆可

目前用 PIL ( pillow )只实现了居中排版、文字描边,描画尺寸和透明背景。其他的还没找到方案。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/342171

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX