feat(projects): 新增Click综合案例示例代码及素材
This commit is contained in:
107
projects/click-cli/watermark/helper.py
Normal file
107
projects/click-cli/watermark/helper.py
Normal file
@@ -0,0 +1,107 @@
|
||||
import logging
|
||||
|
||||
from PIL import Image, ImageEnhance
|
||||
|
||||
logger = logging.getLogger("watermark.helper")
|
||||
|
||||
|
||||
def set_opacity(layer, alpha):
|
||||
if layer.mode != "RGBA":
|
||||
layer = layer.convert("RGBA")
|
||||
|
||||
if 0 <= alpha <= 1:
|
||||
alpha_layer = layer.split()[-1]
|
||||
alpha_layer = ImageEnhance.Brightness(alpha_layer).enhance(alpha)
|
||||
layer.putalpha(alpha_layer)
|
||||
else:
|
||||
logger.warning(
|
||||
f"alpha not works, because the value {alpha} not in [0, 1] interval."
|
||||
)
|
||||
|
||||
return layer
|
||||
|
||||
|
||||
def get_location(image_size, marker_size, loc, offset=0):
|
||||
img_x, img_y = image_size
|
||||
mx, my = marker_size
|
||||
|
||||
half_x = int((img_x - mx) / 2)
|
||||
half_y = int((img_y - my) / 2)
|
||||
|
||||
locations = {
|
||||
# top orient
|
||||
"top-left": (0, 0),
|
||||
"top": (half_x, 0),
|
||||
"top-right": (img_x - mx, 0),
|
||||
# center orient
|
||||
"center-left": (0, half_y),
|
||||
"center": (half_x, half_y),
|
||||
"center-right": (img_x - mx, half_y),
|
||||
# bottom orient
|
||||
"bottom-left": (0, img_y - my),
|
||||
"bottom": (half_x, img_y - my),
|
||||
"bottom-right": (img_x - mx, img_y - my),
|
||||
}
|
||||
location = locations[loc]
|
||||
logger.debug(
|
||||
f"image size: {image_size}, marker size: {marker_size}, {loc} default location: {location}"
|
||||
)
|
||||
|
||||
if offset:
|
||||
x, y = location
|
||||
|
||||
if x == 0:
|
||||
x += offset
|
||||
elif x != half_x:
|
||||
x -= offset
|
||||
|
||||
if loc.startswith("top"):
|
||||
y += offset
|
||||
elif loc.startswith("bottom"):
|
||||
y -= offset
|
||||
|
||||
location = (x, y)
|
||||
|
||||
logger.debug(f"{loc} location: {location}")
|
||||
|
||||
return location
|
||||
|
||||
|
||||
def adjust_marker_layer(
|
||||
image,
|
||||
marker,
|
||||
loc="center",
|
||||
offset=0,
|
||||
**kwargs,
|
||||
):
|
||||
layer = Image.new("RGBA", size=image.size)
|
||||
|
||||
locations = [
|
||||
"top",
|
||||
"top-left",
|
||||
"top-right",
|
||||
"bottom",
|
||||
"bottom-left",
|
||||
"bottom-right",
|
||||
"center",
|
||||
"center-left",
|
||||
"center-right",
|
||||
]
|
||||
|
||||
if loc != "all":
|
||||
if loc not in locations:
|
||||
logger.warning(f"{loc} location not found, use default location: center")
|
||||
locations = ["center"]
|
||||
else:
|
||||
locations = [loc]
|
||||
|
||||
for location in locations:
|
||||
position = get_location(
|
||||
image.size,
|
||||
marker.size,
|
||||
loc=location,
|
||||
offset=offset,
|
||||
)
|
||||
layer.paste(marker, position, mask=marker)
|
||||
|
||||
return layer
|
||||
Reference in New Issue
Block a user