text_extends ведет себя неожиданно, когда я пытаюсь отобразить png, это ошибка?

Недавно я заметил, что в некоторых случаях 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]

person HWM-Rocker    schedule 01.06.2011    source источник


Ответы (1)


Такое поведение, вероятно, связано с самой природой рендеринга текста — поскольку глифы в зависимости от шрифта рисуются по-разному, в зависимости от разрешения в пикселях. Тем более, когда разрешение в пикселях мало по сравнению с размерами глифа (я бы сказал, высота каждого глифа меньше 30 пикселей). Этого поведения следует ожидать в некоторой степени - всегда для того, чтобы отдавать приоритет читабельности текста. Если он слишком неправильный или текст png «уродливее», чем в PDF (вместо неправильного размера), то это ошибка в Cairo. Тем не менее, вы, вероятно, должны разместить именно этот вопрос в трекере Cairo, чтобы разработчики могли сказать, является ли это ошибкой или нет (и если это так, то это, возможно, единственный возможный способ узнать об этом) (по-видимому, они у вас нет общедоступной системы отслеживания ошибок — просто отправьте ее по электронной почте на адрес [email protected] )

Что касается вашей конкретной проблемы, то обходной путь, который я вам предложу, состоит в том, чтобы отобразить ваш текст на большей поверхности - может быть, в 5 раз больше, изменить размер этой поверхности и вставить содержимое на исходную поверхность (если это вообще необходимо). Таким образом, вы можете избежать изменений размера глифа из-за ограничений в количестве пикселей, доступных для каждого глифа (за счет более плохого рендеринга текста в конечном выводе).

person jsbueno    schedule 02.06.2011
comment
Со временем: изменения размера текста из-за разрешения также зависят от шрифта. Попробуйте изменить шрифт просто в качестве эксперимента. - person jsbueno; 02.06.2011