-
Notifications
You must be signed in to change notification settings - Fork 0
/
Txporn.py
95 lines (83 loc) · 3.38 KB
/
Txporn.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import os
import textwrap
import unicodedata
from PIL import Image, ImageDraw, ImageFont
from PIL.ImageColor import getrgb
class Txporn(object):
def __init__(self, input_text: str, output_name: str, font='arial', font_size=20,
color='black', out_dir=r'./', text_transparency=0.0):
self.input_text = input_text
self.font = font
self.size = font_size
self.color = color
self.text_transparency = text_transparency
self.out_dir = out_dir
self.output_name = output_name
self.DPI = (100, 100)
@staticmethod
def count_char(text):
count = 0
for c in text:
if unicodedata.east_asian_width(c) in ["F", "W", "A"]:
count += 1
else:
count += .5
return count
def convert(self):
fontsize = self.size
font = ImageFont.truetype(font=self.font, size=fontsize)
lines = textwrap.wrap(self.input_text, width=40)
y_text, max_width = 0, 0
for line in lines:
width, height = font.getsize(line)
y_text += height
if width > max_width:
max_width = width
interval = y_text/len(lines)
length = self.count_char(self.input_text)
width_p = int(fontsize / 72. * self.DPI[0] * length)
height_p = int(fontsize / 72. * self.DPI[1])
color_rgba = getrgb(self.color) + (int((1. - self.text_transparency) * 255),)
# write text
img = Image.new('RGB', (max_width, y_text+10), (255, 255, 255, 0))
draw = ImageDraw.Draw(img)
lines = textwrap.wrap(self.input_text, width=40)
y_text = 0
for line in lines:
draw.text((0, y_text), line, font=font, fill=color_rgba)
y_text += interval
# draw.text((0, 0), self.input_text, font=font, fill=color_rgba)
# remove margin
crop = img.split()[-1].getbbox()
img = img.crop(crop)
# make directory
dir_path = self.out_dir
if dir_path:
if not os.path.isdir(dir_path):
os.makedirs(dir_path)
output_path = os.path.join(dir_path, self.output_name + ".png")
img.save(output_path, dpi=self.DPI)
# def parse_argument():
# parser = argparse.ArgumentParser("txporn", add_help=True)
# parser.add_argument("--text", "-t", help="input text", type=str)
# parser.add_argument("--font", "-f", help="font name or font file path", type=str, default="Meiryo")
# parser.add_argument("--font_size", "-s", help="font size", type=int, default=20)
# parser.add_argument("--color", "-c", help="text color(color name or color code, e.g. #ffffff)", default="black")
# parser.add_argument("--text_transparency", "-a", help="text transparency (0 ~ 1)", type=float, default=0)
# parser.add_argument("--output_dir_path", "-o", help="output dirctory path", type=str, default="./")
# args = parser.parse_args()
# return args
#
#
#
#
#
if __name__ == '__main__':
new = Txporn(
"It is encouraging to find at the present day so much interest in religious idealism, "+
"and it is proved by Eucken beyond the possibility of doubt that "+
"without some form of such idealism no individual or nation can realise its deepest potencies.",
font='TEMPSITC.TTF', text_transparency=0)
new.convert()