从带有约束的长文本生成 PNG

Generate a PNG from a long text, with constraints

我的需求是能够在不到一秒的时间内生成一个相当长的文本(比如 3000 个字符)的透明 PNG。

我的约束:

我尝试使用具有 'caption' 功能的 Imagemagick,如:

convert -background transparent -font /home/user/fonts/Arial.ttf -density 72 -pointsize 24 -kerning 0 -interline-spacing 0 -size 500x caption:'My very long text ...' output.png

它对小文本很有用,但 3000 个字符的文本将在 16 秒内生成,我找不到优化它的方法。我尝试了从 0 到 100 的每个“-quality”选项,但都没有成功。

例如,质量为15的791个字符耗时3.45秒。从质量 0 到质量 100 的时间大致相同。

convert -background transparent -font Arial.ttf -density 72 -pointsize 24 -size 500x caption:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec malesuada lorem ante, ut venenatis leo venenatis vitae. Phasellus imperdiet volutpat egestas. Nunc lobortis nunc ante, sagittis sagittis ex aliquet sed. Maecenas tempus velit eu leo cursus aliquam. Donec vel purus eget massa lacinia gravida vel vitae elit. Aliquam volutpat ex non purus aliquam, vel faucibus sem molestie. Quisque tincidunt, nulla sed fermentum condimentum, mauris arcu euismod nibh, nec lobortis tortor lorem id quam. Ut pretium lacinia risus id pretium. Suspendisse sit amet dolor ac odio convallis pulvinar vitae ac erat. Nam non congue tellus. Nulla laoreet at justo eget convallis. Phasellus rutrum turpis sed neque vulputate pharetra. Mauris fringilla tincidunt dui, in scelerisque urna sagittis sit amet." -quality 15 /tmp/test.png
quality 15 : 3.4526860713959 s

它尝试了 GraphicksMagick(如本帖 Slow font rendering in ImageMagick 中所述),但我无法使用 --with-ttf 选项编译它,即使我的服务器上安装了 freefont2)。我掉在这里了。

我还尝试生成一个包含我的文本的小 .svg 并使用 rsvg 工具将其转换为 .png。它确实更快,但不符合我的自动换行约束(它需要另一段代码来自动换行,这是我不想要的)。

我找到解决方案的时间缩短了,所以我无法自己测试所有其他可能的方法(尝试另一种优化 IM 的方法?node.js 使用 text2png 或 node-canvas?一个小java 应用程序?...)。

有没有人有这种限制并且可以温和地提供有关可行解决方案的提示?


ImageMagick 版本

Version: ImageMagick 6.8.9-9 Q16 x86_64 2018-11-11 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2014 ImageMagick Studio LLC
Features: DPC Modules OpenMP
Delegates: bzlib cairo djvu fftw fontconfig freetype jbig jng jpeg lcms lqr ltdl lzma openexr pangocairo png rsvg tiff wmf x xml zlib

已测试的 GraphicksMagick 版本

GraphicsMagick 1.3.31 2018-11-17 Q8 http://www.GraphicsMagick.org/
Copyright (C) 2002-2018 GraphicsMagick Group.

在测试 4000x4000 图像上,'quality' 设置似乎是影响 PNG 编码速度的一个重要因素:

No quality: 6.167s
Quality 9:  1.847s
Quality 1:  0.695s

我在这台普通的 2015 笔记本电脑 运行 Ubuntu 上试过 libvips。您应该能够在您的包管理器中找到 vips(例如,libvips-tools 在 Debian 上):

$ time vips text x.png "$(cat lorem.txt)" --width 500 --rgba
real    0m0.084s
user    0m0.062s
sys 0m0.022s

正在生成:

其中:

$ wc lorem.txt 
  9  429 2975 lorem.txt

所以在 0.1 秒内完成 2975 个字符。

text operator has a lot of options,所以应该符合你的条件。