Мой скрипт работает некорректно, помогите кто знает, пожалуйста

def text_render(image,
            x,
            y, 
            text: str| None=None,
            text_size: int | None=200,
            text_font: str | None='Lora',
            straz_size: int | None=2,
            sample: int | None=19,
            threshold: int | None=5,
            distanse: int | None=0) -> Image:

#Константы
scale=1
angle=90

distanse=int(distanse)

x=int(x)
y=int(y)
sample=int(sample)
threshold=int(threshold)/100

def get_pil_text_size(text, font_size, font_name):
    font = font_name
    size = font.getsize(text)
    return size

#Открытие изображения
img=image.copy()
size_text=[0,0]
text_font=f'fonts/{text_font}.ttf'
font = ImageFont.truetype(text_font, round(int(text_size)*37*0.5))
word_list=list(text)
word_list.append(' ')
draw = ImageDraw.Draw(img)
for index,w in enumerate(word_list):
    #size_text=get_pil_text_size(text, round(int(text_size)*37*0.5), text_font) 
    if index==0:
        xy=(0,0)
    else:
        xy=(get_pil_text_size(word_list[index-1], round(int(text_size)*37*0.5), font)[0] ,0)
        size_text[0]+=xy[0]+distanse
        size_text[1]=get_pil_text_size(word_list[index-1], round(int(text_size)*37*0.5), font)[1]
    draw.text((size_text[0],0),w,(0,0,0),font=font, align='center')

    # draw = ImageDraw.Draw(img)
    # text_font=f'fonts/{text_font}.ttf'
    # font = ImageFont.truetype(text_font, round(int(text_size)*37*0.5))
    # size_text=get_pil_text_size(text, round(int(text_size)*37*0.5), text_font) 
    # draw.text((0, 0),text,(0,0,0),font=font, align='center')
#Конвертация изображения в чёрно белое
img=img.convert('L')
img=ImageOps.invert(img)
img=img.point(lambda x: 255 if x > threshold else 0, "1")
img=img.crop((0,0,size_text[0],size_text[1]+50))

#Перебор пикселей
channel = img.split()[0]
channel = channel.rotate(angle, expand=1)
size = channel.size[0]*scale, channel.size[1]*scale
coordsx=[]
coordsy=[]
bitmap = Image.new('1', size, color='black')
draw = ImageDraw.Draw(bitmap)
for x in range(0, channel.size[0], int(sample)):
    for y in range(0, channel.size[1], int(sample)):
        box = channel.crop((x, y, x+int(sample), y+int(sample)))
        
        mean = ImageStat.Stat(box).mean[0]
        x_pos, y_pos = (x+box.size[1]/2) * scale, (y+box.size[1]/2) * scale
        box_edge = straz_size
        if mean>threshold:
            draw.ellipse((x_pos-box_edge, y_pos-box_edge, x_pos+box_edge, y_pos+box_edge),fill=255)
            coordsx.append(x_pos)
            coordsy.append(y_pos)

bitmap = bitmap.rotate(-angle, expand=1)
width_half, height_half = bitmap.size
xx = (width_half - img.size[0]*scale) / 2
yy = (height_half - img.size[1]*scale) / 2
bitmap = bitmap.crop((xx, yy, xx + img.size[0]*scale,yy + img.size[1]*scale))
new_img=ImageOps.invert((Image.merge('1', [bitmap]))).crop((0,0,size_text[0],size_text[1]+50))
return (new_img, (size_text[0],size_text[1]+20))

Данная функция должна переводить шрифт в точки одного размера, но почему-то она делает это неровно, то есть одна и та же буква в слове может выглядеть по-разному и разной толщины. Прошу помочь мне модернизировать скрипт, чтобы он обрабатывал все буквы корректно, заранее спасибо)


Ответы (0 шт):