批量去除图片上的水印可以带来以下好处和实际意义:
1. 提升视觉质量:水印通常是为了保护图片版权或宣传品牌而添加的,但有时会干扰到图片的整体美观度。通过去除水印,可以提升图片的视觉质量,使其更加清晰、自然。
2. 增加使用灵活性:有些图片带有大量水印信息,限制了其在各种应用场景下的使用。去除水印后,可以更自由地应用这些图片,例如用于设计、展示、印刷等。
3. 方便编辑和处理:水印可能遮挡了图片中的关键内容,阻碍了对图片的进一步编辑和处理。去除水印后,可以方便地进行剪裁、调色、添加文本等操作,以达到特定的效果或满足特定需求。
4. 保护隐私:有时图片上的水印可能包含敏感信息或个人隐私,去除水印可以保护这些信息的安全性和私密性。
需要注意的是,去除图片上的水印要遵守法律法规和版权规定,尊重他人的知识产权。在合法和合理的情况下,去除水印可以提高图片的使用价值和观赏性,但我们应该尊重原作者的权益,合理使用图片,并在适当的情况下注明图片来源和归属。
图片水印存在的形式:
一、纯色值型
水印颜色,字体大小,位置都不固定,也没有规则,这个能否实现批量去水印?
比如像豆丁文档这样的水印

那像类似这种水印我们需要如何可以批量快速处理呢;
处理思路:采用色值替换的方式实施;
处理主流程:

调用流程里面的PY模块:

PY完整代码如下:
# 使用提醒:
# 1. xbot包提供软件自动化、数据表格、Excel、日志、AI等功能
# 2. package包提供访问当前应用数据的功能,如获取元素、访问全局变量、获取资源文件等功能
# 3. 当此模块作为流程独立运行时执行main函数
# 4. 可视化流程中可以通过"调用模块"的指令使用此模块
import xbot
from xbot import print, sleep
from .import package
from .package import variables as glv
from PIL import Image
import os
import itertools
def main(args):
file_paths = glv['file_paths']
dsts = [f'{os.path.splitext(f)[0]}_news{os.path.splitext(f)[1]}' for f in file_paths]
def towatermark(s, d):
print("处理图片:", s)
img = Image.open(s)
width, height = img.size
for pos in itertools.product(range(width), range(height)):
r, g, b = img.getpixel(pos)[:3]
sum_rgb = r + g + b
if 550 <= sum_rgb <= 1000: # 豆丁文库水印值范围
img.putpixel(pos, (255, 255, 255)) # 豆丁文库将水印处的像素填充为白色
#if 300 <= sum_rgb <= 400: # 豆丁文库水印值范围
#img.putpixel(pos, (193, 203, 230)) # 豆丁文库将水印处的像素填充为白色
img.save(d)
print("存储为:", d)
for i in range(len(file_paths)):
towatermark(file_paths[i], dsts[i])
自动获取桌面名为12的文件夹里面的JPG或者PNG图片,然后后台循环对每一张需要处理水印的图片进行去水印处理;
执行速度很快、质量也很不错;
在处理豆丁这类平台文档里面的水印的时候,效果很好;
如需修改本地文件目录,可打开主流程里面双击第一行,然后修改为自己的主目录;
如果需要修改调整色值,可以打开PY包的文件,然后找到第27行或28行,修改里面的色值;
if 550 <= sum_rgb <= 1000: # 豆丁文库水印值范围
img.putpixel(pos, (255, 255, 255)) # 豆丁文库将水印处的像素填充为白色
二、非纯色型
对于另外一种像以下图片中的这种水印,则无法精准通过色值来完成;

可以借用阿里云的字幕擦除REMOVEIMAGESUBTITLES服务来实现图片水印的批量处理
主流程代码:
import xbot
import xbot_visual
from . import package
from .package import variables as glv
import time
def main(args):
try:
file_paths = xbot_visual.dir.find_files(path="C:\\Users\\Administrator\\Desktop\\12", patterns="*.jpg", find_subdir=False, skip_hidden_file=False, is_sort=False, sort_by="name", sort_way="increase", _block=("main", 1, "获取文件列表"))
for package.variables['loop_item图片路径'] in xbot_visual.workflow.list_iterator(list=file_paths, loop_start_index="0", loop_end_index="-1", output_with_index=False, _block=("main", 2, "ForEach列表循环")):
package.variables['loop_item图片路径'] = xbot_visual.text.replace_content_from_text(text=glv['loop_item图片路径'], regular_pattern="", replace_way="content", replace_text="\\", just_get_first=False, ignore_case=False, dest_text="/", _block=("main", 3, "文本替换"))
content文件名称_格式 = xbot_visual.text.extract_content_from_text(text=glv['loop_item图片路径'], extract_way="custom", regular_pattern="([^\\\\/]+)$", just_get_first=True, ignore_case=False, _block=("main", 4, "从文本中提取内容"))
#region 处理图片下载图片
_ = xbot_visual.process.run(process="remove_gongsimingcheng", package=__name__, inputs={
}, outputs=[
], _block=("main", 6, "调用流程"))
content = xbot_visual.text.extract_content_from_text(text="str(" + xbot_visual.sh_str(glv['返回状态源码_公司名称']) + ")", extract_way="custom", regular_pattern="(http[s]?:\\/\\/[^\\s]+)", just_get_first=True, ignore_case=False, _block=("main", 7, "从文本中提取内容"))
package.variables['返回图片路径'] = xbot_visual.text.replace_content_from_text(text=content, regular_pattern="", replace_way="content", replace_text="'},", just_get_first=True, ignore_case=False, dest_text=None, _block=("main", 8, "文本替换"))
_ = xbot_visual.process.run(process="remove_tel", package=__name__, inputs={
}, outputs=[
], _block=("main", 9, "调用流程"))
content_电话 = xbot_visual.text.extract_content_from_text(text="str(" + xbot_visual.sh_str(glv['返回状态源码_电话']) + ")", extract_way="custom", regular_pattern="(http[s]?:\\/\\/[^\\s]+)", just_get_first=True, ignore_case=False, _block=("main", 10, "从文本中提取内容"))
package.variables['返回图片路径'] = xbot_visual.text.replace_content_from_text(text=content_电话, regular_pattern="", replace_way="content", replace_text="'},", just_get_first=True, ignore_case=False, dest_text=None, _block=("main", 11, "文本替换"))
_ = xbot_visual.process.run(process="remove_logo", package=__name__, inputs={
}, outputs=[
], _block=("main", 12, "调用流程"))
content_LOGO = xbot_visual.text.extract_content_from_text(text="str(" + xbot_visual.sh_str(glv['返回状态源码_logo']) + ")", extract_way="custom", regular_pattern="(http[s]?:\\/\\/[^\\s]+)", just_get_first=True, ignore_case=False, _block=("main", 13, "从文本中提取内容"))
package.variables['返回图片路径'] = xbot_visual.text.replace_content_from_text(text=content_LOGO, regular_pattern="", replace_way="content", replace_text="'},", just_get_first=True, ignore_case=False, dest_text=None, _block=("main", 14, "文本替换"))
http_download_filename = xbot_visual.web_service.download(url=package.variables['返回图片路径'], save_folder="C:\\Users\\Administrator\\Desktop\\12", custom_filename=True, save_filename=content文件名称_格式, wait_complete_timeout="300", connect_timeout_seconds="30", send_by_web=False, browser=None, _block=("main", 15, "Http 下载"))
#endregion
#endloop
finally:
pass
字幕擦除服务说明
字幕擦除能力可以擦除图片中的标准字幕。
具体介绍如下:https://help.aliyun.com/zh/viapi/developer-reference/api-a4l81q?spm=a2c4g.11186623.0.i16#section-pdm-ivt-o1b
这个应用里面代码关于:ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET 这两个参数的获取是从本地电脑的环境变量里面直接获取的,不由代码配置;
为了保障数据安全,平台关于获取KEY_ID与KEY_SECRET这两个参数后如何配置环境变量,可查阅:https://help.aliyun.com/zh/viapi/use-cases/subtitle-erase-1?spm=a2c4g.11186623.0.i30#e8eef6d3a8c0m
字幕擦除主流程代码:
使用整个API接口的时候,PYTHON需要有:
# 引入依赖包
# alibabacloud_imageenhan20190930

流程对应的PY文件以及整个应用的流程包请登陆后自行下载;
同时阿里云的这个关于需要去除水印区域的配置是在对应py文件里面的第48至51行区域;
bx=0.01, #字幕区域的左上角点x坐标相对视频宽度的占比值
by=0.03, #字幕区域的左上角点y坐标相对视频高度的占比值
bw=0.10, #字幕区域的宽度相对视频宽度的占比值
bh=0.16 #字幕区域的高度相对视频高度的占比值
假设一张图片的尺寸为640*358;即长为640,宽为358;
假设需要去除的水印为图中的这个域名;则有两个点的坐标需要知道;
其一、第一个W左上角的坐标;
其二、与右侧m右下角的坐标;
关于这个坐标如何获得呢?首先将图片通过电脑自带的图片画图编辑器打开;(注意:是系统自带编辑器,不是系统默认图片查看器或者编辑器)
打开编辑器图片后,当鼠标放在图片上时,则就会出现鼠标相对于当前图片区域对应的坐标值;

放在M右下角的时候显示:X417,Y292;得到这两个值后再结合上面的图片的尺寸为640*358,就能计算需要的BX、BY、BH、BW对应的值了;计算方法如下:
BX=205/640=0.32;
BY=270/358=0.75;
BH=(292-270)/358=0.06;
BW=(417-205)/640=0.33;
以上值在计算的时候,四舍五入取小数点后两位数即可,同时要注意:
bx、by、bw和bh表示一个矩形区域的位置和大小,但是您设置的值超过了范围。
您需要根据实际情况调整这些参数的值,确保矩形区域的位置和大小在合理的范围内。例如,您可以尝试减小矩形区域的大小,使其满足要求:bx + bw < 1和by + bh < 1。