【问题标题】:Generate a PNG from a long text, with constraints从带有约束的长文本生成 PNG
【发布时间】:2019-06-18 09:25:23
【问题描述】:

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

我的限制:

  • 文本必须根据 .png 的宽度和字体的大小自动换行
  • 在不到 1 秒的时间内生成 3000 个字符的文本
  • 转换器可以处理任何 .ttf 字体
  • 转换器可以处理自定义字体pointsize、自定义密度、字体颜色、行距、字符紧缩
  • 透明背景
  • 必须在 Unix 上工作

我尝试使用带有“标题”功能的 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 的每一个“质量”选项,但没有任何成功。

例如,质量为 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 中提到的那样),但即使我的服务器上安装了 freefont2,我也无法使用 --with-ttf 选项编译它)。我掉到这里了。

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

我找到解决方案的时间缩短了,所以我自己无法测试所有其他可能的方法(尝试另一种优化 IM 的方法?使用 text2png 或 node-canvas 的 node.js ?一个小型 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.

【问题讨论】:

  • 您可以尝试使用 Pango,您将使用 convert ... pango:@XXX result.png 其中XXX 是包含您的 3,000 个字符的文件
  • 我尝试了常规技术(-depth 8+antialias 并编写 GIF 而不是 PNG 并将质量设置为 10 的倍数以及我所知道的一切)但没有任何帮助。

标签: unix text imagemagick png


【解决方案1】:

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

$ 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

所以 2975 个字符的文本在 0.1 秒内。

text operator has a lot of options,所以它应该满足你的限制。

【讨论】:

    【解决方案2】:

    在测试 4000x4000 图像上,PNG 编码速度的一个重要因素似乎是“质量”设置:

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

    【讨论】:

    • 对不起,我说的是“-密度”,但我测试的是“-质量”。我运行了一个脚本,每次都以 +1 质量值重复转换。就我而言,每次都需要相同的时间。
    猜你喜欢
    • 2015-09-11
    • 2020-02-08
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 2019-05-25
    • 2020-05-30
    • 2016-02-09
    • 1970-01-01
    相关资源
    最近更新 更多