ProcessOn去水印

自己根据bug写了个油猴插件,地址在这:ProcessOn去水印

对你有用的话给个赞!

### 图像去水印的最佳实践 #### 方法一:基于PIL库的手动定位去除法 通过`PIL.ImageDraw.Draw.rectangle()`方法可以实现在已知位置的情况下移除固定位置上的水印。这种方法适用于静态水印,即每次出现的位置都相同的情况。 ```python from PIL import Image, ImageDraw def remove_static_watermark(image_path, save_path, box=(10, 10, 100, 100)): img = Image.open(image_path) draw = ImageDraw.Draw(img) # 使用白色填充覆盖水印区域 draw.rectangle(box, fill="white") img.save(save_path) ``` 此段代码展示了如何利用矩形框定义水印所在范围并将其替换为纯色背景来达到隐藏效果的目的[^1]。 #### 方法二:交互式选取水印边界 为了提高灵活性,可以通过图形界面工具如Tkinter让使用者自行标记出想要消除的部分。这种方式允许更精确地控制要去除的内容及其形状。 ```python import tkinter as tk from PIL import Image, ImageDraw, ImageTk class WatermarkSelector(tk.Tk): def __init__(self, image_file): super().__init__() self.image = Image.open(image_file).convert('RGBA') self.canvas_image = ImageTk.PhotoImage(self.image) self.geometry(f"{self.image.width}x{self.image.height}") canvas = tk.Canvas(self, width=self.image.width, height=self.image.height) canvas.pack() canvas.create_image(0, 0, anchor=tk.NW, image=self.canvas_image) self.points = [] canvas.bind("<Button-1>", lambda event: self.on_click(event)) self.mainloop() def on_click(self, event): point = (event.x, event.y) self.points.append(point) if len(self.points) >= 4: self.destroy() if __name__ == "__main__": selector = WatermarkSelector("image_with_watermark.png") points = sorted(selector.points[:4], key=lambda p:p[0]*p[1]) top_left, bottom_right = tuple(points[0]), tuple(points[-1]) original_img = Image.open("image_with_watermark.png").convert('RGBA') mask_layer = Image.new('L', original_img.size, color=255) draw_mask = ImageDraw.Draw(mask_layer) draw_mask.polygon([*points], outline=0, fill=0) result = Image.composite(Image.new('RGB', original_img.size), original_img.convert('RGB'), mask_layer) result.show() ``` 这段程序提供了一个简易的应用窗口供用户点击选择四边形顶点以确定待处理区域能够更好地适应不同类型的复杂图案[^3]。 #### 方法三:视频中的连续帧批量处理 当面对含有时间维度的信息载体——比如录制下来的影像资料时,则需考虑采用专门针对此类素材设计的技术方案。这里介绍一种借助外部软件FFmpeg完成任务的方式,在Python环境中调用它来进行批量化操作。 ```python import subprocess def batch_remove_watermarks(video_input, video_output, watermark_area=(10, 10, 100, 100)): x, y, w, h = watermark_area ffmpeg_command = [ "ffmpeg", "-i", video_input, "-vf", f"delogo=x={x}:y={y}:w={w}:h={h}", video_output ] process = subprocess.Popen( ffmpeg_command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT ) while True: line = process.stdout.readline().decode() if not line and process.poll() is not None: break print("Processing completed.") ``` 该片段说明了怎样构建命令行参数并通过子进程执行删除动作;同时监控进度直到结束为止[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值