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