Add option to put specific text into text block

This commit is contained in:
Matthias Bisping 2023-01-18 17:18:46 +01:00
parent fd57fe99b7
commit cfe4b58e38

View File

@ -461,12 +461,12 @@ class RandomContentRectangle(ContentRectangle):
class Size(Enum):
SMALL = sqrt(100**2)
MEDIUM = sqrt((100*5)**2)
LARGE = sqrt((100*10)**2)
MEDIUM = sqrt((100 * 5) ** 2)
LARGE = sqrt((100 * 10) ** 2)
def get_size_class(rectangle: Rectangle):
size = get_size(area(rectangle))
size = get_size(rectangle)
if size < Size.SMALL.value:
return Size.SMALL
elif size < Size.LARGE.value:
@ -516,6 +516,7 @@ class RecursiveRandomTable(RandomContentRectangle):
elif choice == "plot":
return generate_random_plot(cell)
else:
cell = generate_text_block(cell, f"{choice} {size:.0f} {get_size_class(cell).name}")
return cell
elif size <= Size.LARGE.value:
@ -527,7 +528,9 @@ class RecursiveRandomTable(RandomContentRectangle):
return cell
else:
return generate_recursive_random_table(cell, border_width=0)
return cell
else:
cell = generate_text_block(cell, f"{choice} {size:.0f} {get_size_class(cell).name}")
return cell
cell.content = inner(cell).content
@ -836,12 +839,19 @@ def maybe():
def generate_random_text_block(rectangle: Rectangle, n_sentences=3000) -> ContentRectangle:
block = RandomTextBlock(*rectangle.coords)
block = TextBlock(*rectangle.coords)
block.content = rectangle.content if isinstance(rectangle, ContentRectangle) else None # TODO: Refactor
block.generate_random_text(rectangle, n_sentences)
return block
def generate_text_block(rectangle: Rectangle, text) -> ContentRectangle:
block = TextBlock(*rectangle.coords)
block.content = rectangle.content if isinstance(rectangle, ContentRectangle) else None # TODO: Refactor
block.put_text(text, rectangle)
return block
def write_lines_to_image(lines: List[str], rectangle: Rectangle, font=None) -> Image.Image:
def write_line(line, line_number):
draw.text((0, line_number * text_size), line, font=font, fill=(0, 0, 0, 255))
@ -858,7 +868,7 @@ def write_lines_to_image(lines: List[str], rectangle: Rectangle, font=None) -> I
return image
class RandomTextBlock(ContentRectangle):
class TextBlock(ContentRectangle):
def __init__(self, x1, y1, x2, y2):
super().__init__(x1, y1, x2, y2)
self.blank_line_percentage = random.uniform(0, 0.5)
@ -870,6 +880,21 @@ class RandomTextBlock(ContentRectangle):
def generate_random_text(self, rectangle: Rectangle, n_sentences=3000):
lines = generate_random_text_lines(rectangle, self.format_lines, n_sentences)
image = write_lines_to_image(lines, rectangle, self.font)
return self.__put_content(image)
def put_text(self, text: str, rectangle: Rectangle):
text_width, text_height = self.font.getsize(text)
assert text_width <= rectangle.width
assert text_height <= rectangle.height
image = Image.new("RGBA", (text_width, text_height), (0, 255, 255, 0))
draw = ImageDraw.Draw(image)
draw.text((0, 0), text, font=self.font, fill=(0, 0, 0, 255))
return self.__put_content(image)
def __put_content(self, image: Image.Image):
self.content = image if not self.content else superimpose_texture_with_transparency(self.content, image)
assert self.content.mode == "RGBA"
return self