如何获取(网页)字体中单个字符的大小?
我写了一个Python脚本,用来生成一个SVG文件。这个SVG文件使用了一种网络字体(通过CSS从谷歌网页字体导入),这样可以让我的文本看起来更好。现在一切都很好,但我需要在把句子放进SVG文件之前,先知道这个句子的大小(以像素为单位)。
我几天前才开始学习Python,所以我不知道这种事情是否可能。谷歌帮我找到了ImageFont这个Python模块(来自Python图像库),但它似乎需要从本地路径加载字体文件,才能计算字符的大小。
请问有没有可能用网络字体来计算字符大小的方法呢?
谢谢你的帮助。
2 个回答
你每次都打算用同样的字体吗?如果是的话,那就先把这个字体下载到本地,自己在电脑上测试一下,然后把结果存起来(可以用SQLite数据库?或者在Python模块里存一个宽度的数组?这就看你怎么选择了)。不过要注意,句子的宽度可能并不是它里面每个字符宽度的简单相加,因为有个叫做字距调整的东西。如果想要准确的话,你得计算整个句子的宽度。
不过,这真的需要在服务器上做吗?比如说,如果你的客户端是一个网页浏览器,你可以用像jQuery的.width()方法来询问浏览器某个元素的实际大小,或者在你自己的JavaScript里做一些处理。
更好的办法可能是设计一个更“灵活”的SVG布局,预期这个元素可能会根据内容的多少而变大或变小,然后用简单的代码,比如elementtext = elementtext[:100]
来限制文本长度在一个预设的值以内。基本上,就是确保它能处理一定量的文本,然后确保你不会用超过这个量的文本。你可不是要把《独立宣言》当作文本标签吧?
你可以在客户端使用JavaScript和SVG DOM来实现这个功能。
第一步:创建一个文本元素,并使用getComputedTextLength()方法来计算它的长度(http://www.w3.org/TR/SVG11/text.html#InterfaceSVGTextContentElement)。
<text id="foo" xml:space="preserve">foo </text>
然后使用getTotalLength()方法来计算路径的长度(http://www.w3.org/TR/SVG11/paths.html#InterfaceSVGPathElement)。
这样你就可以计算出在文本被截断之前,可以放多少次这个文本。