首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确定使用svgwrite python时的文本宽度和高度?

如何确定使用svgwrite python时的文本宽度和高度?
EN

Stack Overflow用户
提问于 2014-06-21 01:43:41
回答 4查看 5.8K关注 0票数 7

我想要提取文本对象 (svgwrite.Drawing.Text)的像素大小,因为它将在格式化后以给定的样式出现在文件中。我的字体是固定宽度(快递新)。

我之所以需要它,是因为我想将一个字符串打印到SVG文件中,然后在结果文本上映射一些信息:例如,我有一个字符串"ABCDEF“,外部智者告诉我,应该标记"BCD”部分。那么我需要知道多少像素(单位?)在两个维度上都覆盖符号"A“和符号"BCD”,然后绘制一个彩色矩形或透明框架,或任何严格在"BCD“部分下的内容。

所以我有下面的代码,我希望使用类似于"w = text1.width“之类的东西来提取宽度,但是它不是这样工作的。谢谢你提前回答我的问题。

代码语言:javascript
复制
import svgwrite
my_svg = svgwrite.Drawing(filename = "dasha.svg", size = ("800px", "600px"))
text_style = "font-size:%ipx; font-family:%s" % (12, "Courier New") 
text1 = my_svg.text("HELLO WORLD", insert=(0, 0), fill="black", style=text_style)
my_svg.add(text1)
my_svg.save()

UPD1 22.06.2014:我目前使用的中间解决方案是在Inkscape中使用特定字体和大小来测量字母的高度和宽度。我尽了最大努力,但我不确定这些值是否完美,现在我无法在程序中更改字体大小。

EN

回答 4

Stack Overflow用户

发布于 2017-10-10 18:13:01

我想以特定字体确定svgwrite中文本的宽度。最后,我使用了来自http://blog.mathieu-leplatre.info/text-extents-with-python-cairo.html的以下解决方案

代码语言:javascript
复制
def textwidth(text, fontsize=14):
    try:
        import cairo
    except Exception, e:
        return len(str) * fontsize
    surface = cairo.SVGSurface('undefined.svg', 1280, 200)
    cr = cairo.Context(surface)
    cr.select_font_face('Arial', cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_BOLD)
    cr.set_font_size(fontsize)
    xbearing, ybearing, width, height, xadvance, yadvance = cr.text_extents(text)
    return width

它将cairo作为依赖项引入,但它是我迄今为止发现的最干净、与平台无关的解决方案。

票数 4
EN

Stack Overflow用户

发布于 2015-02-26 11:47:09

我有同样的问题,但我有一个可变宽度字体。我通过获取我想要的文本元素(正确的字体和内容)来解决这个问题,并将其写入svg文件,并使用安装在我的PC上的Inkscape将绘图呈现为一个临时的png文件。然后,我返回png文件的大小(从标题中提取),删除临时svg和png文件,并使用结果将文本放置在我想要的位置以及周围的元素。

我发现,使用DPI 90绘制一幅图,似乎给出了我所需要的确切数字,或者svgwrite作为一个整体使用的本地数字。-D是要使用的标志,因此只呈现可绘制元素,即文本。

代码语言:javascript
复制
os.cmd(/cygdrive/c/Program\ Files\ \(x86\)/Inkscape/inkscape.exe -f work_temp.svg -e work_temp.png -d 90 -D)

我使用这些函数提取在这个链接中找到的png数字,注意,对于python3 (仍在python2中工作),我的函数略有更正。

代码语言:javascript
复制
def is_png(data):
    return (data[:8] == b'\x89PNG\r\n\x1a\n'and (data[12:16] == b'IHDR'))

def get_image_info(data):
    if is_png(data):
        w, h = struct.unpack('>LL', data[16:24])
        width = int(w)
        height = int(h)
    else:
        raise Exception('not a png image')
    return width, height

if __name__ == '__main__':
    with open('foo.png', 'rb') as f:
        data = f.read()

    print is_png(data)
    print get_image_info(data)

它很笨重,但起作用了

票数 1
EN

Stack Overflow用户

发布于 2018-01-22 18:08:45

最后我用了Tkinter:

代码语言:javascript
复制
try:
    # for Python2
    import Tkinter
except ImportError:
    # for Python3
    import tkinter as Tkinter

try:
    import tkFont
except ImportError:
    import tkinter.font as tkFont

def get_text_metrics(family, size, text):
    # initialize Tk so that font metrics will work
    tk_root = Tkinter.Tk()
    font = None
    font = tkFont.Font(family=family, size=size)
    assert font is not None
    (w, h) = (font.measure(text), font.metrics('linespace'))
    return (w, h)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24337531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档