数行のテキストがあり、それぞれの幅を Context の幅に合わせたい (フォント サイズをスケーリングする) 必要があります。これを行う方法はありますか?これには pangocairo と python を使用しています。
1254 次
1 に答える
2
実用的なソリューションを提供する時間が欲しいのですが、次のようなものから始めることができます。
import cairo
import pango
import pangocairo
import sys
W = 500
H = int(1.4 * W)
surf = cairo.ImageSurface(cairo.FORMAT_ARGB32, W, H)
context = cairo.Context(surf)
#draw a background rectangle:
context.rectangle(0, 0, W, H)
context.set_source_rgb(1, 1, 1)
context.fill()
#get font families:
font_map = pangocairo.cairo_font_map_get_default()
families = font_map.list_families()
# to see family names:
#print sorted([f.get_name() for f in font_map.list_families()])
# context.set_antialias(cairo.ANTIALIAS_SUBPIXEL)
# Translates context so that desired text upperleft corner is at 0,0
text = """Fit line
to width with
Pango
and Cairo"""
fontname = "Arial"
context.set_source_rgb(0, 0, 0)
y = 0
for line in text.split("\n"):
pangocairo_context = pangocairo.CairoContext(context)
pangocairo_context.set_antialias(cairo.ANTIALIAS_SUBPIXEL)
layout = pangocairo_context.create_layout()
font = pango.FontDescription(fontname + " 25")
layout.set_font_description(font)
layout.set_text(line)
pangocairo_context.update_layout(layout)
w, h = layout.get_pixel_size()
print w, h, y
context.translate(0, y)
pangocairo_context = pangocairo.CairoContext(context)
pangocairo_context.set_antialias(cairo.ANTIALIAS_SUBPIXEL)
layout = pangocairo_context.create_layout()
font_descr = "{} {:0.1f}".format(fontname, float(W) / w * 25)
font = pango.FontDescription(font_descr)
layout.set_font_description(font)
layout.set_text(line)
_, y = layout.get_pixel_size()
pangocairo_context.update_layout(layout)
pangocairo_context.show_layout(layout)
with open("cairo_text.png", "wb") as image_file:
surf.write_to_png(image_file)
結果:
このアルゴリズムの改善は、読者の演習として残しておきます。次のことを試すことができます。
- フォントをスケーリングして調整した後、レイアウトの幅を確認します
- 大きなフォント サイズでレンダリングし、
pangocairo_context
代わりに拡大縮小する - わかりません。実際、
pycairo
あなたの質問を読んでドキュメントをゴーグルするまで、私は何も知りませんでした。
于 2015-03-03T01:50:23.817 に答える