没有测试。 如果只是压缩不加水印 可以设置
修改 # 如果图片宽度或高度小于500像素,则不添加水印并直接保存图片 ,把500设置更大,比如999999
在这个版本中,我添加了以下功能:
支持设置水印的透明度(opacity),范围是0(完全透明)到1(完全不透明)。
允许用户指定输出图片的质量(quality),这会影响JPEG格式图片的压缩质量。
增加了对水印位置(position)的更多选项支持,包括随机位置('random')、中心位置('center')、顶部左侧('top-left')、顶部右侧('top-right')、底部左侧('bottom-left')和底部右侧('bottom-right')。
增加了对无效位置参数的异常处理。
允许用户指定输出图片的格式(format),比如JPEG、PNG等。
你可以根据自己的需求调整这些参数和功能。
import random
from PIL import Image
def add_watermark(image_path, watermark_path, output_path, position='random', size=(140, 90), opacity=0.5, quality=90, format='JPEG'):
try:
img = Image.open(image_path)
width, height = img.size
# 如果图片宽度或高度小于500像素,则不添加水印并直接保存图片
if width < 500 or height < 500:
img.save(output_path, format=format, quality=quality)
return "Image is too small to add watermark."
# 图片大小调整逻辑(如果需要)
max_width = 800
if width > max_width:
scale_ratio = max_width / width
new_height = int(height * scale_ratio)
img = img.resize((max_width, new_height), Image.LANCZOS)
# 加载水印图片并调整大小
watermark = Image.open(watermark_path)
watermark = watermark.resize(size, Image.LANCZOS)
# 确保水印是RGBA模式
if watermark.mode != 'RGBA':
watermark = watermark.convert('RGBA')
# 调整水印的透明度
watermark_alpha = watermark.split()[-1]
adjusted_alpha = Image.eval(watermark_alpha, lambda a: int(a * opacity * 255))
watermark_with_alpha = Image.merge('RGBA', watermark.split()[:-1] + (adjusted_alpha,))
# 确定水印位置
if position == 'random':
max_x = width - size[0]
max_y = height - size[1]
left = random.randint(0, max_x)
top = random.randint(0, max_y)
position = (left, top)
elif position == 'center':
left = (width - size[0]) // 2
top = (height - size[1]) // 2
position = (left, top)
elif position == 'top-left':
position = (0, 0)
elif position == 'top-right':
position = (width - size[0], 0)
elif position == 'bottom-left':
position = (0, height - size[1])
elif position == 'bottom-right':
position = (width - size[0], height - size[1])
else:
raise ValueError("Invalid position. Use 'random', 'center', 'top-left', 'top-right', 'bottom-left', or 'bottom-right'.")
# 粘贴水印到图片上
img.paste(watermark_with_alpha, position, watermark_with_alpha)
# 保存带有水印的图片
img.save(output_path, format=format, quality=quality)
return "Watermark added successfully."
except IOError:
return "Failed to open image or watermark file."
except Exception as e:
return "Failed to add watermark: " + str(e)
# 使用示例
add_watermark('path_to_your_image.jpg', 'path_to_your_watermark.png', 'path_to_output_image.jpg', position='bottom-right', opacity=0.3, quality=80, format='PNG')