pillow로 text 진흙탕 letter-spacing

9654 단어 Pythonpillowtech
pillow로 text에 letter spacing을 치고 싶은데 기준이 준비되지 않아서 자비로 썼어요.
한 글자 한 글자.이런 방법도 있지만 베이스라인이 잘 안 풀릴 것 같은 예감이 들어 드로잉->컷->패딩을 계산해 재구성하는 수단을 썼다.
def letter_spacing(font, text, letter_spacing):
    font_size = font.getsize(text)
    text_img = Image.new("L", font_size, color=255)
    
    draw = ImageDraw.Draw(text_img)
    draw.text((0, 0), text, font=font)

    # paddingを含めたサイズの計算・新しい画像の生成
    padded_width = font_size[0] + letter_spacing * (len(text) -1)
    padded_text_img = Image.new("L", (padded_width, font_size[1]), color=255)
    
    # 文字を切り出しつつ結合
    char_imgs = []
    cursor = 0
    for i, char in enumerate(list(text)):
        char_w = font.getsize(char)[0]
        end = cursor + char_w
        ws = (cursor + 1, end)
        char_img = text_img.crop((ws[0], 0, ws[1], text_img.height))
        
        new_paste_w = ws[0] + i * letter_spacing
        padded_text_img.paste(char_img, (new_paste_w, 0))
        cursor = end  # increment
    return padded_text_img

if __name__ == "__main__":
    
    img = Image.new("L", (600, 200), color=255)
    font = ImageFont.truetype("./Roboto-Bold.ttf", 40)
    text = "1,234 good morning"

    # paddingしてない版の描画
    font_size = font.getsize(text)
    text_img = Image.new("L", font_size, color=255)
    draw = ImageDraw.Draw(text_img)
    draw.text((0, 0), text, font=font)
    img.paste(text_img)

    # padding版の描画
    letter_spacing_img  = letter_spacing(font, text, 10)
    img.paste(letter_spacing_img, (0, font_size[1]))

    img.save("./output.png")

결실


좋은 웹페이지 즐겨찾기