#png #cairo #pycairo
#png #cairo #pycairo
Вопрос:
Недавно я заметил, что в некоторых случаях 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_testd.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]
Ответ №1:
Такое поведение, вероятно, связано с природой самого рендеринга текста — поскольку глифы в зависимости от шрифта отображаются по-разному, в зависимости от разрешения пикселя. Тем более, когда разрешение в пикселях невелико по сравнению с размерами глифа (я бы сказал, что высота глифа составляет менее 30 пикселей). Такого поведения следует ожидать в некоторой степени — всегда для того, чтобы расставить приоритеты в удобочитаемости текста. Если это слишком неправильно — или текст в формате png «уродливее», чем в формате PDF (вместо неправильного размера), то это ошибка iis в Cairo. Тем не менее, вам, вероятно, следует поместить этот точный вопрос в систему отслеживания проблем Cairo, чтобы разработчики могли определить, ошибка это или нет (и если это так, возможно, это единственный возможный способ для них узнать об этом) (по-видимому, у них нет общедоступного средства отслеживания ошибок — просто отправьте его по электронной почте cairo-bugs@cairographics.org )
Что касается вашей конкретной проблемы, обходной путь, который я вам предложу, заключается в том, чтобы отобразить ваш текст на большей поверхности — возможно, в 5 раз больше, и изменить размер этой поверхности и вставить содержимое на вашу исходную поверхность (если это вообще необходимо). Таким образом, вы могли бы избежать изменений размера глифа из-за ограничений по количеству пикселей, доступных для каждого глифа (за счет ухудшения рендеринга текста на вашем конечном выходе).
Комментарии:
1. Со временем: изменения размера текста из-за разрешения также зависят от шрифта. Попробуйте изменить свой шрифт просто в качестве эксперимента.