Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from PIL import Image, ImageDraw,ImageFont
- class TextWriter:
- font = None
- images = None
- image_url = r"fon.jpg"
- font_url = r'Abram.ttf'
- flag_rotate = False
- line = 0
- limit_line_count = 19
- limit_pixels_x = 610
- draw = None
- # Инициализация класса
- def __init__(self, rotation=False):
- self.font = ImageFont.truetype(self.font_url, size=40)
- self.images = []
- self.flag_rotate = rotation
- self.new_page(rotation=180*int(self.flag_rotate))
- # Метод создания новой страницы
- def new_page(self, rotation: int = 0):
- tmp = Image.open(self.image_url)
- tmp = tmp.rotate(rotation)
- self.draw = ImageDraw.Draw(tmp)
- self.images.append(tmp)
- return True
- # Метод добавления текста
- def add_text(self, text: str = '', fill: str = '#1a03ad'):
- # Разбиваем текст на параграфы
- text = text.split('\n')
- # Каждый параграф разбиваем на слова и разбиваем длину параграфа по строчкам
- # Каждая строчка может достигать установленного предела по пикселям(self.limit_pixels_x)
- # И так каждый параграф
- # В результате получаем массив result_text, в котором каждый каждый элемент - один параграф,
- # а каждый элемент параграфа - одна строчка из этого параграфа
- result_text = []
- for paragraph in text:
- splited_paragraph = []
- line = ''
- for word in paragraph.split(' '):
- if self.font.getsize(f"{line} {word}")[0] <= self.limit_pixels_x:
- line += ' ' + word
- else:
- splited_paragraph.append(line)
- line = word
- if len(line) > 0:
- splited_paragraph.append(line)
- if len(splited_paragraph) > 0:
- result_text.append(splited_paragraph)
- # Осталось только добавить этот текст на листы
- for paragraph in result_text:
- for number, line in enumerate(paragraph):
- if self.line >= self.limit_line_count:
- self.new_page(rotation=180*int(not self.flag_rotate))
- self.flag_rotate = not self.flag_rotate
- self.line = 0
- self.draw.text(
- (14 + 100*int(self.flag_rotate), 8 + 46*self.line),
- line,
- font=self.font,
- fill=fill
- )
- self.line += 1
- return True
- # Метод сохранения. Принимает в себя параметр file_name - имя файла
- def save(self, file_name: str = 'image.jpg'):
- file_name = file_name.split('.')
- file_name = [
- ''.join(
- (_+".") for _ in file_name[:-1]
- )[:-1],
- file_name[-1]
- ]
- result = []
- for number, image in enumerate(self.images):
- if number == 0:
- tmp = f"{file_name[0]}.{file_name[1]}"
- else:
- tmp = f'{file_name[0]}_{number}.{file_name[1]}'
- result.append(tmp)
- image.save(tmp)
- return result
- writer = TextWriter()
- writer.add_text(
- "Hello, my dear friend!\n"
- "My name is Ilya. I am from Russia, Moscow. I like play basketball, write something program. What are you like do?\n"
- )
- writer.add_text(
- "Oh, I am sorry, I forgot to say you that you are 'dolboyeb ebaniy'"
- )
- writer.save('file1.jpg')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement