|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- import os
- import random
- from PIL import Image, ImageDraw, ImageFont
-
- # set up the image folder and font file
- image_folder = 'dogetemplates/'
- font_file = 'impact.ttf'
-
- # get a list of all the image files in the folder
- image_files = [os.path.join(image_folder, f) for f in os.listdir(image_folder) if os.path.isfile(os.path.join(image_folder, f))]
-
- # set up the text parameters
-
- text_color = (255, 255, 255)
- text_outline_color = (0, 0, 0)
- text_outline_width = 2
-
- # load the text files
- with open('strings.txt', 'r') as f:
- string_lines = f.readlines()
- with open('strings_toptext.txt', 'r') as f:
- string_toptext_lines = f.readlines()
- with open('strings_bottomtext.txt', 'r') as f:
- string_bottomtext_lines = f.readlines()
-
- # create the output folder if it doesn't exist
- output_folder = 'randomdoges'
- if not os.path.exists(output_folder):
- os.makedirs(output_folder)
-
- # generate a random meme
- image_file = random.choice(image_files)
- image = Image.open(image_file)
- draw = ImageDraw.Draw(image)
-
- # scale the font size based on a 500x500 image
- if image.width < 500 and image.height < 500:
- font_size = int(40)
- else:
- font_size = int(40 * (min(image.width, image.height) / 500))
- font = ImageFont.truetype(font_file, font_size)
-
- top_text = random.choice(string_lines + string_toptext_lines).strip().upper()
- bottom_text = random.choice(string_lines + string_bottomtext_lines).strip().upper()
-
- text_width, text_height = draw.textsize(top_text, font)
- while text_width > image.width:
- font_size -= 1
- font = ImageFont.truetype(font_file, font_size)
- text_width, text_height = draw.textsize(top_text, font)
-
- x = (image.width - text_width) / 2
- y = 10
- draw.text((x, y), top_text, font=font, fill=text_color, stroke_width=text_outline_width, stroke_fill=text_outline_color)
-
- text_width, text_height = draw.textsize(bottom_text, font)
- while text_width > image.width:
- font_size -= 1
- font = ImageFont.truetype(font_file, font_size)
- text_width, text_height = draw.textsize(bottom_text, font)
-
- x = (image.width - text_width) / 2
- y = image.height - text_height - 10
- draw.text((x, y), bottom_text, font=font, fill=text_color, stroke_width=text_outline_width, stroke_fill=text_outline_color)
-
- # set the image size
- min_size = 225
- max_size = 960
- new_size = random.randint(min_size, max_size)
- image = image.resize((new_size, new_size))
-
- # wrap text to new lines if it goes out of bounds
- max_width = int(image.width * 0.8)
- top_text_lines = []
- bottom_text_lines = []
- for text, lines in [(top_text, top_text_lines), (bottom_text, bottom_text_lines)]:
- words = text.split()
- current_line = words[0]
- for word in words[1:]:
- if draw.textsize(current_line + ' ' + word, font=font)[0] < max_width:
- current_line += ' ' + word
- else:
- lines.append(current_line)
- current_line = word
- lines.append(current_line)
-
- # draw the text on the image
- text_y = 10
- for line in top_text_lines:
- text_width, text_height = draw.textsize(line, font)
- x = (image.width - text_width) / 2
- draw.text((x, text_y), line, font=font, fill=text_color, stroke_width=text_outline_width, stroke_fill=text_outline_color)
- text_y += text_height
-
- text_y = image.height - 10
- for line in reversed(bottom_text_lines):
- text_width, text_height = draw.textsize(line, font)
- x = (image.width - text_width) / 2
- text_y -= text_height
- draw.text((x, text_y), line, font=font, fill=text_color, stroke_width=text_outline_width, stroke_fill=text_outline_color)
-
- # save the meme with an incrementing file name in the output folder
- file_num = len(os.listdir(output_folder))
- file_name = f"randomdoge{file_num:04d}.jpg" # 4-digit padded file number
- output_path = os.path.join(output_folder, file_name)
- image.save(output_path)
|