最近、png と pdf の見た目が異なる場合があることに気付きました。プレビュー イメージをさまざまなサイズでレンダリングしたところ、サーフェスの出力サイズを変更すると、同じ入力に対して出力がまったく異なる可能性があることに気付きました。
問題は、表面のピクセル サイズが異なる場合、text_extends が同じテキストに対して異なる正規化されたサイズを報告することです。この例では、幅は 113.861 から 120.175 まで変化します。各行を別々に書かなければならないので、これらのエラーは合計で何倍も大きくなります。
これらの誤算を回避する方法を知っている人はいますか?
これは、この問題の小さなデモンストレーションです
import cairo
form StringIO import StringIO
def render_png(width, stream):
width_px = height_px = width
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width_px, height_px)
cr = cairo.Context(surface)
cr.scale(float(width_px) / float(100),
float(height_px) / float(100))
cr.set_antialias(cairo.ANTIALIAS_GRAY)
cr.set_source_rgb (1, 1, 1)
cr.rectangle(0, 0, 100, 100)
cr.fill()
cr.select_font_face('Zapfino Extra LT') # a fancy font
cr.set_font_size(20)
example_string = 'Ein belieber Test Text'
xbearing, ybearing, width, height, xadvance, yadvance = (
cr.text_extents(example_string))
xpos = (100. - width) / 2. # centering text
print width
cr.move_to(xpos,50)
cr.set_source_rgba(0,0,0)
cr.show_text(example_string)
surface.write_to_png(stream)
return width
if __name__ == '__main__':
l=[]
for i in range(100,150,1):
outs=StringIO()
xpos = render_png(i,outs)
l.append((i,xpos))
#out = open('/home/hwmrocker/Desktop/FooBar/png_test%03d.png'%i, 'w')
#outs.seek(0)
#out.write(outs.read())
#out.close()
from operator import itemgetter
l=sorted(l,key=itemgetter(1))
print
print l[0]
print l[-1]