GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.

WatermarkFilter   A
last analyzed

Complexity

Total Complexity 29

Size/Duplication

Total Lines 234
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 234
rs 10
wmc 29

14 Methods

Rating   Name   Duplication   Size   Complexity  
A _get_scaled_image() 0 21 2
A apply() 0 21 3
A _center_position() 0 12 1
A _bottom_right_position() 0 12 1
A _get_image() 0 14 3
F __init__() 0 34 10
A _top_left_position() 0 9 1
A _top_position() 0 12 1
A _right_position() 0 12 1
A _bottom_position() 0 12 1
A _reduce_opacity() 0 14 2
A _left_position() 0 12 1
A _top_right_position() 0 12 1
A _bottom_left_position() 0 12 1
1
"""
2
This module implement a Watermark filter.
3
"""
4
from __future__ import unicode_literals, division
5
import os
6
from flask import current_app
7
8
from .interface import ImagineFilterInterface
9
from PIL import Image, ImageEnhance
10
11
12
class WatermarkFilter(ImagineFilterInterface):
13
    """
14
    Watermark filter
15
    """
16
    positions = ['top_left', 'top', 'top_right', 'left', 'center', 'right', 'bottom_left', 'bottom', 'bottom_right']
17
18
    image_path = None
19
    image = None
20
    size = None
21
    position = None
22
    opacity = None
23
24
    def __init__(self, **kwargs):
25
        """
26
        :param kwargs: dict
27
        """
28
        if 'image' in kwargs:
29
            self.image_path = os.path.normpath(str(kwargs['image']))
30
        else:
31
            raise ValueError('Watermark image path doesn\'t set.')
32
33
        if 'size' in kwargs:
34
            try:
35
                self.size = float(kwargs.get('size'))
36
                assert 0 <= self.size <= 1
37
            except Exception as err:
38
                raise ValueError('Unsupported size format: %s' % str(err))
39
        else:
40
            raise ValueError('Watermark size doesn\'t set.')
41
42
        if 'position' in kwargs:
43
            if kwargs['position'] in self.positions:
44
                self.position = kwargs.get('position')
45
            else:
46
                raise ValueError('Unsupported watermark position: %s' % kwargs.get('position'))
47
        else:
48
            raise ValueError('Watermark position doesn\'t set.')
49
50
        if 'opacity' in kwargs:
51
            try:
52
                self.opacity = float(kwargs.get('opacity', 0.3))
53
                assert 0 <= self.opacity <= 1
54
            except Exception as err:
55
                raise ValueError('Unsupported opacity format: %s' % str(err))
56
        else:
57
            self.opacity = 0.3
58
59
    def apply(self, resource):
60
        """
61
        Apply filter to resource
62
        :param resource: Image.Image
63
        :return: Image.Image
64
        """
65
        if not isinstance(resource, Image.Image):
66
            raise ValueError('Unknown resource format')
67
68
        resource_format = resource.format
69
        if resource.mode != 'RGBA':  # pragma: no cover
70
            resource = resource.convert('RGBA')
71
72
        layer = Image.new('RGBA', resource.size, (0, 0, 0, 0))
73
        image, left, upper = getattr(self, '_' + self.position + '_position')(resource)
74
        layer.paste(image, (left, upper))
75
76
        image = Image.composite(layer, resource, layer)
77
        image.format = resource_format
78
79
        return image
80
81
    def _top_left_position(self, resource):
82
        """
83
        Place watermark to top left position
84
        :param resource: Image.Image
85
        :return: Image.Image
86
        """
87
        image = self._get_scaled_image(resource)
88
89
        return image, 0, 0
90
91
    def _top_position(self, resource):
92
        """
93
        Place watermark to top position
94
        :param resource: Image.Image
95
        :return: Image.Image
96
        """
97
        image = self._get_scaled_image(resource)
98
99
        left = int(round(resource.size[0] // 2 - image.size[0] // 2))
100
        upper = 0
101
102
        return image, left, upper
103
104
    def _top_right_position(self, resource):
105
        """
106
        Place watermark to top right position
107
        :param resource: Image.Image
108
        :return: Image.Image
109
        """
110
        image = self._get_scaled_image(resource)
111
112
        left = int(round(resource.size[0] - image.size[0]))
113
        upper = 0
114
115
        return image, left, upper
116
117
    def _left_position(self, resource):
118
        """
119
        Place watermark to left position
120
        :param resource: Image.Image
121
        :return: Image.Image
122
        """
123
        image = self._get_scaled_image(resource)
124
125
        left = 0
126
        upper = int(round(resource.size[1] // 2 - image.size[1] // 2))
127
128
        return image, left, upper
129
130
    def _center_position(self, resource):
131
        """
132
        Place watermark to center position
133
        :param resource: Image.Image
134
        :return: Image.Image
135
        """
136
        image = self._get_scaled_image(resource)
137
138
        left = int(round(resource.size[0] // 2 - image.size[0] // 2))
139
        upper = int(round(resource.size[1] // 2 - image.size[1] // 2))
140
141
        return image, left, upper
142
143
    def _right_position(self, resource):
144
        """
145
        Place watermark to right position
146
        :param resource: Image.Image
147
        :return: Image.Image
148
        """
149
        image = self._get_scaled_image(resource)
150
151
        left = int(round(resource.size[0] - image.size[0]))
152
        upper = int(round(resource.size[1] // 2 - image.size[1] // 2))
153
154
        return image, left, upper
155
156
    def _bottom_left_position(self, resource):
157
        """
158
        Place watermark to bottom left position
159
        :param resource: Image.Image
160
        :return: Image.Image
161
        """
162
        image = self._get_scaled_image(resource)
163
164
        left = 0
165
        upper = int(round(resource.size[1] - image.size[1]))
166
167
        return image, left, upper
168
169
    def _bottom_position(self, resource):
170
        """
171
        Place watermark to bottom position
172
        :param resource: Image.Image
173
        :return: Image.Image
174
        """
175
        image = self._get_scaled_image(resource)
176
177
        left = int(round(resource.size[0] // 2 - image.size[0] // 2))
178
        upper = int(round(resource.size[1] - image.size[1]))
179
180
        return image, left, upper
181
182
    def _bottom_right_position(self, resource):
183
        """
184
        Place watermark to bottom right position
185
        :param resource: Image.Image
186
        :return: Image.Image
187
        """
188
        image = self._get_scaled_image(resource)
189
190
        left = int(round(resource.size[0] - image.size[0]))
191
        upper = int(round(resource.size[1] - image.size[1]))
192
193
        return image, left, upper
194
195
    def _get_image(self):
196
        """
197
        Prepare watermark image
198
        :return: Image.Image
199
        """
200
        if self.image is None:
201
            image_path = '%s/%s' % (current_app.static_folder, os.path.normpath(self.image_path))
202
            try:
203
                self.image = Image.open(image_path)
204
                self._reduce_opacity()
205
            except Exception as err:
206
                raise ValueError('Unsupported watermark format: %s' % str(err))
207
208
        return self.image
209
210
    def _reduce_opacity(self):
211
        """
212
        Reduce opacity for watermark image.
213
        """
214
        if self.image.mode != 'RGBA':
215
            image = self.image.convert('RGBA')
216
        else:
217
            image = self.image.copy()
218
219
        alpha = image.split()[3]
220
        alpha = ImageEnhance.Brightness(alpha).enhance(self.opacity)
221
        image.putalpha(alpha)
222
223
        self.image = image
224
225
    def _get_scaled_image(self, resource):
226
        """
227
        Get scaled watermark image
228
        :param resource: Image.Image
229
        :return: Image.Image
230
        """
231
        image = self._get_image()
232
        original_width, original_height = resource.size
233
234
        k = image.size[0] / float(image.size[1])
235
236
        if image.size[0] >= image.size[1]:
237
            target_width = int(original_width * self.size)
238
            target_height = int(target_width / k)
239
        else:
240
            target_height = int(original_height * self.size)
241
            target_width = int(target_height * k)
242
243
        image = image.resize((target_width, target_height), Image.ANTIALIAS)
244
245
        return image
246
247