基于Python实现网页版去水印之去除图片右下角水印

基于Python实现网页版去图片右下角水印

Python可以用OpenCV去除图片水印,但如何结合web框架去实现网页版去水印,带着这样的疑问,我搜索研究了一下,发现是完全可以实现的,而且考虑到部署服务器,也是可以实现的,这里就不详细说明了。本文采用Pycharm软件。

基于Flask框架实现网页上传图片,执行效果:

打开网页输入以下网址:127.0.0.1:5000,这是来源于后面代码app.run(host='0.0.0.0', port=5000, debug=True)。

代码解析:

(1)Flask框架搭建

新建qushuiyin.py文件,在该文件下输入以下代码。

from flask import Flask, render_template, request, redirect, url_for, make_response, jsonify
from werkzeug.utils import secure_filename
import os
import cv2
import time
import numpy as np
from PIL import Image

from datetime import timedelta

# 设置允许的文件格式
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'JPG', 'PNG', 'bmp'])


def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS


app = Flask(__name__)
# 设置静态文件缓存过期时间
app.send_file_max_age_default = timedelta(seconds=1)


# @app.route('/upload', methods=['POST', 'GET'])
@app.route('/', methods=['POST', 'GET'])  # 添加路由
def upload():
    if request.method == 'POST':
        f = request.files['file']

        if not (f and allowed_file(f.filename)):
            return jsonify({"error": 1001, "msg": "请检查上传的图片类型,仅限于png、PNG、jpg、JPG、bmp"})

        user_input = request.form.get("name")

        basepath = os.path.dirname(__file__)  # 当前文件所在路径

        upload_path = os.path.join(basepath, './static/photo', secure_filename(f.filename))  # 注意:没有的文件夹一定要先创建,不然会提示没有该路径
        f.save(upload_path)

        return render_template('REpicture_ok.html', val1=time.time())

    return render_template('REpicture.html')


if __name__ == '__main__':
    # app.debug = True
    app.run(host='0.0.0.0', port=5000, debug=True)

(2)REpicture_ok.html和Repicture.html搭建

在当前目录下新建Repicture_ok.html和Repicture.html空白文件,输入以下代码。

#REpicture.html
<head>
    <meta charset="UTF-8">
    <title>图片右下角去水印</title>
</head>
<body>
    <h1>请上传图片文件</h1>
    <form action="" enctype='multipart/form-data' method='POST'>
        <input type="file" name="file" style="margin-top:20px;"/>
        <br>
        <input type="submit" value="去水印" class="button-new" style="margin-top:15px;"/>
    </form>
</body>
</html>
#REpicture_ok.html
<head>
    <meta charset="UTF-8">
    <title>图片右下角去水印</title>
</head>
<body>
    <h1>请上传图片文件</h1>
    <form action="" enctype='multipart/form-data' method='POST'>
        <input type="file" name="file" style="margin-top:20px;"/>
        <br>
        <input type="submit" value="去水印" class="button-new" style="margin-top:15px;"/>
    </form>
    <img src="{{ url_for('static', filename= './photo/result.jpg',_t=val1) }}" width="400" height="400" alt="你的图片被外星人劫持了~~"/>
</body>
</html>

注意:filename= './photo/result.jpg',路径要描述准确,否则会报错。

(3)实现右下角去水印

在qushuiyin.py里f.save(upload_path)代码后接着输入以下代码:

# 使用Opencv转换一下图片格式和名称
        img = cv2.imread(upload_path,1)
        newPath = os.path.join(basepath,'./static/photo','new.jpg')
        hight, width, depth = img.shape[0:3]
        # 提取
        cropped = img[int(hight * 0.8):hight, int(width * 0.5):width]  # 剪裁座标为[y0:y1, x0:x1]
        cv2.imwrite(newPath, cropped)
        imgSY = cv2.imread(newPath, 1)
        # 照片二值化解决,把[200,200,200]-[250,250,250]之外的色调变为0
        thresh = cv2.inRange(imgSY, np.array([200, 200, 200]), np.array([250, 250, 250]))
        # 建立样子和规格的构造原素
        kernel = np.ones((3, 3), np.uint8)
        # 拓展待修补地区
        hi_mask = cv2.dilate(thresh, kernel, iterations=10)
        specular = cv2.inpaint(imgSY, hi_mask, 5, flags=cv2.INPAINT_TELEA)
        cv2.imwrite(newPath, specular)

        # 遮盖照片
        imgSY = Image.open(newPath)
        img = Image.open(upload_path)
        img.paste(imgSY, (int(width * 0.5), int(hight * 0.8), width, hight))
        img.save(upload_path)
        img=cv2.imread(upload_path)
        cv2.imwrite(os.path.join(basepath, './static/photo', 'result.jpg'), img)
        os.remove(os.path.join(basepath,'./static/photo','new.jpg'))
        os.remove(os.path.join(basepath,'./static/photo', secure_filename(f.filename)))

说明:

1. int(width * 0.5), int(hight * 0.8),两个常数是可以调节的,但要注意前后一致;

2.'./static/photo'注意路径;

3.过程中会产生几个文件,使用os.remove进行删除操作。

总结:

右下角去水印项目已经很成熟了,网上可以找到很多实例,但结合时下服务器的应用还有待开拓,所以本文还有很多拓展空间,留待后面慢慢完善。

<think>好的,我现在需要帮用户找一个用Python编写的去除抖音视频水印的脚本示例。首先,用户提到了参考站内的三个引用,我需要仔细看一下这些引用里的内容,看看有没有相关的代码或者方法。 引用[1]提到可以使用you-get或yt-dlp这样的开源项目进行批量下载和去水印。这可能涉及到先下载视频,然后再处理水印。不过用户的问题更侧重于去除水印的脚本,所以可能需要结合下载和处理两部分。 引用[2]给出了一个使用FFmpeg的delogo filter的Python脚本示例。这个脚本通过subprocess调用FFmpeg命令来去除水印,用户需要提供水印的位置和尺寸参数。看起来这是一个直接处理本地视频文件的方法,但前提是需要先下载视频。 引用[3]中的代码展示了如何从抖音链接中提取视频ID,可能用于下载视频。结合引用[3]和引用[1],可能需要先下载视频,然后再用引用[2]的方法去除水印。 用户的需求是去除抖音视频水印的脚本,所以可能需要整合下载和去水印的步骤。首先,需要下载抖音视频,可能涉及解析URL获取视频的真实地址,然后下载视频文件,接着使用FFmpeg处理水印。 需要注意的是,抖音视频的水印通常位于固定位置,比如右下角,坐标可能是(10,10)或者类似的位置,但具体可能需要用户自己确认。另外,使用delogo滤镜需要准确的水印区域参数,如果位置不对,处理效果可能不好。 另外,引用[3]中的代码只是简单地从URL中提取视频ID,但实际上抖音的视频下载可能需要更复杂的解析,比如访问API或者处理加密参数。这里可能需要使用第三方库,比如yt-dlp或者you-get,这些库可以处理下载过程,包括获取无水印的视频链接。 所以整个流程可能是:使用yt-dlp或you-get下载无水印视频,或者下载带水印的视频后再用FFmpeg去除。不过根据引用[1],可能有些方法可以直接下载无水印版本,这可能是更高效的方式,不需要后续处理。 但用户特别询问的是去除水印的脚本,因此可能需要两种情况:一种是直接下载无水印视频,另一种是下载后处理。需要看看哪种方法更可行。 根据引用[2],FFmpeg的方法需要本地处理,可能适用于已经下载的视频。而引用[1]和[3]提到的可能是在下载时获取无水印版本。需要进一步确认抖音的API是否提供无水印视频的下载链接。 通常,抖音的视频有水印去水印两种版本,去水印的链接可能需要特定的参数或请求头来获取。例如,通过解析视频页面的源代码,找到无水印的URL,然后下载。 所以,可能的步骤是: 1. 解析用户提供的抖音视频URL,获取视频ID或其他参数。 2. 构造请求,获取无水印视频的真实下载链接。 3. 使用Python下载该链接的视频文件。 4. 如果无法直接获取无水印版本,则下载带水印的视频,然后用FFmpeg处理。 但引用[2]中的代码是处理本地视频,所以可能需要结合下载和处理两个步骤。比如先用you-get下载视频,然后用FFmpeg去水印。 现在需要写一个Python脚本示例,可能整合这些步骤。例如,使用yt-dlp下载视频,然后用subprocess调用FFmpeg去除水印。或者,如果能够直接获取无水印的URL,直接下载即可。 不过根据引用[3]中的代码示例,可能用户需要的是如何解析URL并下载,然后再去除水印。但引用[3]的代码可能不完整,因为仅仅分割URL获取video_id可能不足以获取下载链接,可能需要更多的步骤,比如发送请求,处理JSON数据等。 综合来看,用户需要的是一个完整的脚本示例,可能包括下载和处理两部分。但根据现有的引用,可能需要分步骤说明。例如,先使用you-get下载视频,然后使用FFmpeg去水印。 或者,直接使用yt-dlp,因为它可能支持下载无水印的抖音视频。例如,yt-dlp可能有一个选项可以直接获取无水印版本,无需后续处理。这可能是更高效的方法。 但需要验证这一点。例如,yt-dlp的文档中是否有提到支持抖音去水印。如果支持,那么脚本可以很简单,只需要调用yt-dlp即可。否则,需要结合FFmpeg处理。 假设用户需要的是下载后处理水印,那么脚本示例可能包括: 1. 下载视频(带水印)。 2. 使用FFmpeg的delogo滤镜去除水印。 但用户可能更希望直接下载无水印的视频,这样更高效。因此,可能需要优先考虑直接下载无水印版本的方法。 不过根据引用[1],使用you-get或yt-dlp配置参数可能实现去水印下载。需要确认这些工具是否支持抖音的无水印下载。 例如,yt-dlp可能有一个参数,如--format来指定格式,或者需要添加特定的提取器参数来获取无水印链接。可能需要查看相关文档或社区讨论。 如果无法直接下载无水印视频,那么只能下载后处理。此时,结合引用[2]中的FFmpeg处理脚本。 因此,最终的脚本示例可能分为两部分:下载和处理。但用户可能希望一个完整的脚本,自动完成整个过程。 另外,需要注意法律和平台规定,去除水印可能涉及版权问题,需要提醒用户。 现在,根据引用内容,给出一个示例脚本。可能先使用引用[3]的方法获取视频ID,然后构造无水印URL,下载视频。如果不行,则下载后处理。 例如: - 使用requests库发送请求,解析返回的JSON数据,找到无水印视频链接。 - 下载该链接。 - 如果无法找到,则下载带水印版本,然后用FFmpeg处理。 但具体的抖音API可能已经变化,需要最新的方法。这里可能需要参考第三方库的实现。 考虑到时间和复杂度,可能更实际的示例是使用yt-dlp下载,假设其支持无水印: ```python import yt_dlp def download_douyin_video(url): ydl_opts = { 'outtmpl': '%(title)s.%(ext)s', 'format': 'bestvideo+bestaudio/best', # 可能需要的其他参数,比如提取无水印链接 } with yt_dlp.YoutubeDL(ydl_opts) as ydl: info = ydl.extract_info(url, download=True) print(f"下载完成: {info['title']}") ``` 但不确定yt-dlp是否默认下载无水印的抖音视频。如果不行,可能需要自定义提取器或参数。 如果必须处理水印,则结合引用[2]的FFmpeg脚本: ```python import subprocess def remove_watermark(input_video, output_video, x, y, w, h): cmd = [ 'ffmpeg', '-i', input_video, '-vf', f'delogo=x={x}:y={y}:w={w}:h={h}', '-c:a', 'copy', output_video ] subprocess.run(cmd) # 使用示例 download_douyin_video('抖音视频URL') remove_watermark('下载的视频.mp4', '无水印视频.mp4', 10, 10, 100, 100) ``` 但需要用户自行确定水印的位置和尺寸,这可能因视频而异。通常,抖音的水印右下角,坐标可能类似x=视频宽度-水印宽度-边距,y=视频高度-水印高度-边距。但需要具体分析。 综上,可能需要分步骤说明:先下载视频,然后去水印。同时提醒用户水印位置需要自己确认。 根据引用内容,给出的示例应包含下载和处理两部分,可能结合引用[3]的下载和引用[2]的处理,但需要更完整的代码。 另外,引用[3]中的代码可能不足以正确获取视频ID,因为抖音的URL结构可能变化,需要更健壮的解析方法。 因此,最终的脚本可能如下: 使用yt-dlp下载视频,然后用FFmpeg去水印。或者,如果yt-dlp无法直接获取无水印版本,则下载后处理。 但考虑到用户希望去除水印,可能更直接的方法是使用FFmpeg处理,因此示例脚本可能侧重于处理部分,假设用户已经下载了视频。 不过用户的问题是如何用Python脚本去除抖音视频水印,所以可能更关注处理部分,而下载部分可能属于另一个步骤。 因此,重点放在引用[2]中的FFmpeg处理,并给出一个完整的示例,包括下载和处理。 总结:结合引用[2]和[3],给出一个下载并去水印Python脚本示例,使用you-get或yt-dlp下载,然后使用FFmpeg处理。但需要确保这些库已安装。 最后,提醒用户注意水印位置和版权问题。</think>以下是一个基于Python的抖音视频去水印脚本实现方案,结合视频下载和水印处理两个核心环节: ### 一、视频下载模块 使用`yt-dlp`库实现视频下载,该库支持解析抖音视频的真实地址: ```python # 安装依赖:pip install yt-dlp import yt_dlp def download_video(url): ydl_opts = { 'outtmpl': '%(title)s.%(ext)s', 'format': 'bestvideo+bestaudio/best', 'quiet': True } with yt_dlp.YoutubeDL(ydl_opts) as ydl: info_dict = ydl.extract_info(url, download=True) return info_dict['requested_downloads'][0]['filename'] ``` ### 二、水印处理模块 调用FFmpeg的delogo滤镜进行水印去除[^2]: ```python import subprocess def remove_watermark(input_file, output_file, x=10, y=10, w=100, h=30): command = [ 'ffmpeg', '-i', input_file, '-vf', f'delogo=x={x}:y={y}:w={w}:h={h}:show=0', '-c:a', 'copy', output_file ] subprocess.run(command, check=True) ``` ### 三、完整调用示例 ```python if __name__ == "__main__": douyin_url = "https://v.douyin.com/xxxxxx" # 替换为实际链接 # 下载视频 downloaded_file = download_video(douyin_url) # 去除水印(默认参数针对右下角水印) output_file = downloaded_file.replace('.mp4', '_nologo.mp4') remove_watermark(downloaded_file, output_file, x=600, y=1200, w=200, h=60) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯狂的豆包

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值