如何通过影刀RPA服务来实现图片水印的批量处理 by、付涛纪实阁
回答
收藏

如何通过影刀RPA服务来实现图片水印的批量处理 by、付涛纪实阁

h
huazhongxu
2023-11-24 11:44·浏览量:1272
h
huazhongxu
影刀中级开发者
发布于 2023-11-24 11:27更新于 2023-11-24 11:441272浏览

批量去除图片上的水印可以带来以下好处和实际意义:

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。

收藏4
全部回答1
最新
发布回答
回答