import sys
from PIL import Image, ImageFilter
def insta_size_no_padding(img):
w, h = img.size
new = Image.new(img.mode, (max(w, h), max(w, h)), (255, 255, 255))
if h >= w:
new.paste(img, (int((max(w, h) - w) / 2), 0))
else:
new.paste(img, (0, int((max(w, h) - h) / 2)))
return new
def insta_size_padding(img):
w, h = img.size
padding_percentage = 0.02
length = max(w, h)
padding = int(padding_percentage * length)
new = Image.new(img.mode, (length + 2 * padding, length + 2 * padding), 0xFAFAFA)
if h >= w:
new.paste(img, (int((length + 2 * padding - w) / 2), padding))
else:
new.paste(img, (padding, int((length + 2 * padding - h) / 2)))
return new
def drop_shadow(image, offset=(5, 5), background=0xffffff, shadow=0x444444, border=8, iterations=50):
"""
Add a gaussian blur drop shadow to an image.
image - The image to overlay on top of the shadow.
offset - Offset of the shadow from the image as an (x,y) tuple. Can be
positive or negative.
background - Background colour behind the image.
shadow - Shadow colour (darkness).
border - Width of the border around the image. This must be wide
enough to account for the blurring of the shadow.
iterations - Number of times to apply the filter. More iterations
produce a more blurred shadow, but increase processing time.
"""
w, h = image.size
total_width = w + abs(offset[0]) + 2 * border
total_height = h + abs(offset[1]) + 2 * border
back = Image.new(image.mode, (total_width, total_height), background)
shadow_image = Image.new(image.mode, (w, h), shadow)
shadow_left = border + max(offset[0], 0)
shadow_top = border + max(offset[1], 0)
back.paste(shadow_image, (shadow_left, shadow_top))
n = 0
while n < iterations:
back = back.filter(ImageFilter.BLUR)
n += 1
image_left = border - min(offset[0], 0)
image_top = border - min(offset[1], 0)
back.paste(image, (image_left, image_top))
return back
if __name__ == "__main__":
if len(sys.argv) <= 1:
exit(0)
for file in sys.argv[1:]:
names = file.split(".")
if len(names) != 2:
continue
try:
im = Image.open(file)
except Exception as e:
print(str(e))
continue
result = insta_size_no_padding(drop_shadow(im, background=0xFAFAFA, shadow=0x444444, offset=(20, 20)))
result.save("{}-square-shadow.{}".format(names[0], names[1]), quality=100)