From 13849f2e24218424779e8e2b489ba380cef0d356 Mon Sep 17 00:00:00 2001 From: Sanyam Jain <14850141+SJ029626@users.noreply.github.com> Date: Thu, 21 Feb 2019 00:15:48 +0530 Subject: [PATCH] changes for logo --- manipulation.py | 243 +++++++++++++++++++++++---------------------- opengenus_logo.png | Bin 0 -> 21740 bytes 2 files changed, 126 insertions(+), 117 deletions(-) create mode 100644 opengenus_logo.png diff --git a/manipulation.py b/manipulation.py index 2afcb90..e2ca8d7 100644 --- a/manipulation.py +++ b/manipulation.py @@ -1,117 +1,126 @@ -from PIL import Image, ImageFont, ImageDraw -import textwrap -import os - -font_path = "impact/impact.ttf" -font_size = 9 - -def text_on_top (text, image, resize=(None,None)): - ''' - Input PIL Image object - Puts text on the top of the image w/r/t the image height and width - Returns the PIL Image object, its height and width - ''' - if resize != (None, None): - image = image.resize(resize, Image.ANTIALIAS) - - draw = ImageDraw.Draw(image) - (image_width, image_height) = image.size - font = ImageFont.truetype(font=font_path, - size=int(image_height - * font_size) // 100) - text = text.upper() - (char_width, char_height) = font.getsize('A') - chars_per_line = image_width // char_width - top_lines = textwrap.wrap(text, width=chars_per_line) - y = 10 - - for line in top_lines: - (line_width, line_height) = font.getsize(line) - x = (image_width - line_width) / 2 - draw.text((x, y), line, fill='white', font=font) - y += line_height - - return image - -def text_in_bottom (text, image, resize=(None, None)): - ''' - Input PIL image object - Puts Text in the bottom of the image w/r/t the image height and width - Returns the PIL Image object, its height and width - ''' - if resize != (None, None): - image = image.resize(resize, Image.ANTIALIAS) - - draw = ImageDraw.Draw(image) - (image_width, image_height) = image.size - font = ImageFont.truetype(font=font_path, - size=int(image_height - * font_size) // 100) - text = text.upper() - (char_width, char_height) = font.getsize('A') - chars_per_line = image_width // char_width - bottom_lines = textwrap.wrap(text, - width=chars_per_line) - y = image_height - char_height * len(bottom_lines) - 15 - - for line in bottom_lines: - (line_width, line_height) = font.getsize(line) - x = (image_width - line_width) / 2 - draw.text((x, y), line, fill='white', font=font) - y += line_height - - return image - -def image_join_along_breadth(image1, image2, size1=(None, None), size2=(None, None)): - ''' - Concatenates two images side by side - Input PIL Image obejct - Returns the PIL Image object, its height and width - ''' - - if size1 != (None, None): - image1 = image1.resize(size1, Image.ANTIALIAS) - if size2 != (None, None): - image2 = image2.resize(size2, Image.ANTIALIAS) - - image1.save('short1.jpg') - image2.save('short2.jpg') - images = map(Image.open, ['short1.jpg', 'short2.jpg']) - - image_width = image1.size[0] + image2.size[0] - image_height = image1.size[1] - image = Image.new('RGB', (image_width, image_height)) - x_offset = 0 - - for im in images: - image.paste(im, (x_offset, 0)) - x_offset += im.size[0] - - return image - -def image_join_along_length(image1, image2, size1=(None, None), size2=(None, None)): - ''' - Input PIL Image obejct - Concatenates images in a top to bottom fashion - Returns PIL Image object, its height and width - ''' - - if size1 != (None, None): - image1 = image1.resize(size1, Image.ANTIALIAS) - if size2 != (None, None): - image2 = image2.resize(size2, Image.ANTIALIAS) - - image1.save('short1.jpg') - image2.save('short2.jpg') - images = map(Image.open, ['short1.jpg', 'short2.jpg']) - - image_width = image1.size[0] - image_height = image1.size[1] + image2.size[1] - image = Image.new('RGB', (image_width, image_height)) - y_offset = 0 - - for im in images: - image.paste(im, (0, y_offset)) - y_offset += im.size[1] - - return image +from PIL import Image, ImageFont, ImageDraw +import textwrap +import os + +font_path = "impact/impact.ttf" +font_size = 9 + +def text_on_top (text, image, resize=(None,None)): + ''' + Input PIL Image object + Puts text on the top of the image w/r/t the image height and width + Returns the PIL Image object, its height and width + ''' + if resize != (None, None): + image = image.resize(resize, Image.ANTIALIAS) + + draw = ImageDraw.Draw(image) + (image_width, image_height) = image.size + font = ImageFont.truetype(font=font_path, + size=int(image_height + * font_size) // 100) + text = text.upper() + (char_width, char_height) = font.getsize('A') + chars_per_line = image_width // char_width + top_lines = textwrap.wrap(text, width=chars_per_line) + y = 10 + + for line in top_lines: + (line_width, line_height) = font.getsize(line) + x = (image_width - line_width) / 2 + draw.text((x, y), line, fill='white', font=font) + y += line_height + + return image + +def text_in_bottom (text, image, resize=(None, None)): + ''' + Input PIL image object + Puts Text in the bottom of the image w/r/t the image height and width + Returns the PIL Image object, its height and width + ''' + if resize != (None, None): + image = image.resize(resize, Image.ANTIALIAS) + + draw = ImageDraw.Draw(image) + (image_width, image_height) = image.size + font = ImageFont.truetype(font=font_path, + size=int(image_height + * font_size) // 100) + text = text.upper() + (char_width, char_height) = font.getsize('A') + chars_per_line = image_width // char_width + bottom_lines = textwrap.wrap(text, + width=chars_per_line) + y = image_height - char_height * len(bottom_lines) - 15 + + for line in bottom_lines: + (line_width, line_height) = font.getsize(line) + x = (image_width - line_width) / 2 + draw.text((x, y), line, fill='white', font=font) + y += line_height + + return image + +def image_join_along_breadth(image1, image2, size1=(None, None), size2=(None, None)): + ''' + Concatenates two images side by side + Input PIL Image obejct + Returns the PIL Image object, its height and width + ''' + + if size1 != (None, None): + image1 = image1.resize(size1, Image.ANTIALIAS) + if size2 != (None, None): + image2 = image2.resize(size2, Image.ANTIALIAS) + + image1.save('short1.jpg') + image2.save('short2.jpg') + images = map(Image.open, ['short1.jpg', 'short2.jpg']) + + image_width = image1.size[0] + image2.size[0] + image_height = image1.size[1] + image = Image.new('RGB', (image_width, image_height)) + x_offset = 0 + + for im in images: + image.paste(im, (x_offset, 0)) + x_offset += im.size[0] + + return image + +def image_join_along_length(image1, image2, size1=(None, None), size2=(None, None)): + ''' + Input PIL Image obejct + Concatenates images in a top to bottom fashion + Returns PIL Image object, its height and width + ''' + + if size1 != (None, None): + image1 = image1.resize(size1, Image.ANTIALIAS) + if size2 != (None, None): + image2 = image2.resize(size2, Image.ANTIALIAS) + + image1.save('short1.jpg') + image2.save('short2.jpg') + images = map(Image.open, ['short1.jpg', 'short2.jpg']) + + image_width = image1.size[0] + image_height = image1.size[1] + image2.size[1] + image = Image.new('RGB', (image_width, image_height)) + y_offset = 0 + + for im in images: + image.paste(im, (0, y_offset)) + y_offset += im.size[1] + + return image + +def add_logo(): + logo = Image.open('opengenus_logo.png') + nimg = logo.resize((90,30)) + n=img.size + k=int(n[0] - 90) + g=int(n[1] - 35) + img.paste(nimg, ((k),(g))) + img.show() diff --git a/opengenus_logo.png b/opengenus_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e06b83cd4bd9a6246dcba66c0c0195844a0c9c00 GIT binary patch literal 21740 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 DddyRt literal 0 HcmV?d00001