Last active
March 21, 2018 13:55
-
-
Save LowerDeez/ab841c6174dca689994361cff7fe9b9b to your computer and use it in GitHub Desktop.
Django. How to add watermark
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" Function for applying watermarks to images. | |
Original found here: | |
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/362879 | |
""" | |
try: | |
import Image | |
import ImageEnhance | |
except ImportError: | |
try: | |
from PIL import Image | |
from PIL import ImageEnhance | |
except ImportError: | |
raise ImportError("The Python Imaging Library was not found.") | |
def reduce_opacity(im, opacity): | |
"""Returns an image with reduced opacity.""" | |
assert opacity >= 0 and opacity <= 1 | |
if im.mode != 'RGBA': | |
im = im.convert('RGBA') | |
else: | |
im = im.copy() | |
alpha = im.split()[3] | |
alpha = ImageEnhance.Brightness(alpha).enhance(opacity) | |
im.putalpha(alpha) | |
return im | |
def apply_watermark(im, mark, position, opacity=1): | |
"""Adds a watermark to an image.""" | |
if opacity < 1: | |
mark = reduce_opacity(mark, opacity) | |
if im.mode != 'RGBA': | |
im = im.convert('RGBA') | |
# create a transparent layer the size of the image and draw the | |
# watermark in that layer. | |
layer = Image.new('RGBA', im.size, (0, 0, 0, 0)) | |
if position == 'tile': | |
for y in range(0, im.size[1], mark.size[1]): | |
for x in range(0, im.size[0], mark.size[0]): | |
layer.paste(mark, (x, y)) | |
elif position == 'scale': | |
# scale, but preserve the aspect ratio | |
ratio = min( | |
float(im.size[0]) / mark.size[0], float(im.size[1]) / mark.size[1]) | |
w = int(mark.size[0] * ratio) | |
h = int(mark.size[1] * ratio) | |
mark = mark.resize((w, h)) | |
layer.paste(mark, (int((im.size[0] - w) / 2), int((im.size[1] - h) / 2))) | |
else: | |
layer.paste(mark, position) | |
# composite the watermark with the layer | |
return Image.composite(layer, im, layer) | |
def test(): | |
im = Image.open('test.png') | |
mark = Image.open('overlay.png') | |
watermark(im, mark, 'tile', 0.5).show() | |
watermark(im, mark, 'scale', 1.0).show() | |
watermark(im, mark, (100, 100), 0.5).show() | |
if __name__ == '__main__': | |
test() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
for gallery in obj.gallery.all(): | |
try: | |
add_watermark(gallery.media.file, obj.rialtor.water_mark.file) | |
except IOError: | |
continue |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
import json | |
from datetime import datetime | |
from itertools import izip | |
from decimal import Decimal | |
import PIL as pil | |
from PIL import ImageEnhance | |
import StringIO | |
from django.contrib.auth import update_session_auth_hash | |
from django.shortcuts import render, redirect | |
from django.core.urlresolvers import reverse | |
from django.db.models import ( | |
Prefetch, Count, Case, When, IntegerField, Sum, DecimalField, Q) | |
from django.db.models.functions import Coalesce, Concat | |
from django.http import Http404, JsonResponse, HttpResponse | |
from django.conf import settings | |
from django.core.files.base import ContentFile | |
def add_watermark(image_file, logo_file, opacity=.8): | |
img = pil.Image.open(image_file).convert('RGB') | |
logo = pil.Image.open(logo_file) | |
# TODO: add aspect ratio as an argument | |
base_width = img.size[0] / float(2) * 2 | |
base_height = img.size[1] / float(3) * 2.5 | |
base_width = min(base_width, base_height) | |
wpercent = base_width / float(logo.size[0]) | |
hsize = int((float(logo.size[1]) * float(wpercent))) | |
logo = logo.resize((int(base_width), hsize), pil.Image.ANTIALIAS) | |
# position the watermark | |
offset_x = abs(img.size[0] - logo.size[0]) / 2 | |
offset_y = abs(img.size[1] - logo.size[1]) / 2 | |
watermark = pil.Image.new('RGBA', img.size, (255, 255, 255, 1)) | |
watermark.paste(logo, (offset_x, offset_y)) | |
alpha = watermark.split()[3] | |
alpha = pil.ImageEnhance.Brightness(alpha).enhance(opacity) | |
watermark.putalpha(alpha) | |
pil.Image.composite( | |
watermark, img, watermark | |
).save(".".join(image_file.path.split(".")[:-1]) + ".jpg", 'JPEG') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment