0

最近、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]
4

1 に答える 1

0

この動作は、テキスト レンダリング自体の性質が原因である可能性があります。フォント依存のグリフは、ピクセル解像度に応じてさまざまな方法で描画されるためです。グリフのサイズと比較してピクセル解像度が小さい場合はなおさらです (グリフあたりの高さが 30px 未満と言えます)。この動作はある程度拡張されることが予想されます - 常にテキストの読みやすさを優先するためです。ずれすぎている場合、または png テキストが PDF よりも「醜い」(サイズが正しくない) 場合は、Cairo のバグです。それにもかかわらず、開発者がそれがバグであるかどうかを判断できるように、おそらくこの正確な質問を Cairo の問題トラッカーに投稿する必要があります (バグである場合は、バグに気付く唯一の方法かもしれません) (どうやら彼らは公開されているバグトラッカーはありません - cairo-bugs@cairographics.org に電子メールで送信してください)

特定の問題に関しては、私が提案する回避策は、テキストをより大きな表面 (おそらく 5 倍) にレンダリングし、その表面のサイズを変更して、元の表面にコンテンツを貼り付けることです (必要な場合)。このようにして、各グリフで使用できるピクセル数の制約によるグリフ サイズの変動を回避できます (最終出力でのテキスト レンダリングが低下するという犠牲を払います)。

于 2011-06-02T12:37:20.930 に答える