2024-06-25 23:59:19 发布
网友
我正在使用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>
我想如果你用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>
;