【发布时间】:2016-05-16 17:39:19
【问题描述】:
我正在使用 python 生成一个带有可以变化的文本的 SVG,我想在它后面放置一个半透明的矩形,以保证稍后在另一个图形元素上覆盖时有一定的对比度。
不幸的是,我不知道如何预测 SVG 中特定文本字符串的像素范围。我可以选择我使用的字体(但我不认为等宽字体可以接受)以及我使用的字体大小。
如何使用 python 来预测 SVG 文本的范围,以便生成适当大小的矩形?
【问题讨论】:
我正在使用 python 生成一个带有可以变化的文本的 SVG,我想在它后面放置一个半透明的矩形,以保证稍后在另一个图形元素上覆盖时有一定的对比度。
不幸的是,我不知道如何预测 SVG 中特定文本字符串的像素范围。我可以选择我使用的字体(但我不认为等宽字体可以接受)以及我使用的字体大小。
如何使用 python 来预测 SVG 文本的范围,以便生成适当大小的矩形?
【问题讨论】:
我认为如果您在 Python 中执行此操作,事情会变得一团糟。可能压力最小的方法是安装FreeType 并使用它为您计算文本尺寸。但对于一个很小的坚果来说,这是一把非常大的锤子。
This answer 展示了一种更简单的方法 - 使用 SVG 过滤器将背景直接应用于文本,而无需调整任何内容。
您也可以将此方法用于半透明背景:
<svg width="360" height="100" viewBox="0 0 360 100">
<defs>
<filter x="0" y="0" width="1" height="1" id="text-bg">
<feFlood flood-color="#ff0" flood-opacity="0.5" />
<feComposite in="SourceGraphic" />
</filter>
</defs>
<rect x="0" y="0" width="400" height="100" fill="#444" stroke="none" />
<path d="m0 10 40 80 40-80 40 80 40-80 40 80 40-80 40 80 40-80 40 80"
stroke="#888" stroke-width="10" fill="none" />
<text font-family="Arial" font-weight="bold" filter="url(#text-bg)"
x="180" y="50" font-size="20" fill="#000" text-anchor="middle">
Edit this text and reload the SVG
</text>
</svg>
【讨论】: