使用腾讯云盲水印服务进行图片水印添加和提取的一个Python Demo

2023-11-11

前言

首先,本文写于 2021-5-17,也许在未来的某个时间点,腾讯云盲水印服务的 Python SDK 文档已经写的比较好了,然后你读到了这篇文章,那么可以考虑略过。

起因(可略过)

腾讯云盲水印服务的 Python SDK 文档 确实已经存在,但问题是,对于一个想快速上手此服务的开发者来说,这份SDK文档并不是一个适合抄作业的良好示例。
以下是 2021-5-17 腾讯云盲水印服务 Python SDK 文档的截图
2021-5-17 腾讯云盲水印服务 Python SDK 文档截图
其文档定义了一个叫ci_put_object_from_local_file()的方法原型,然后又给出了调用了这个方法的一个代码片段。经过实际运行,问题有二。

  1. 此方法在cos-python-sdk-v5==1.9.4的pip库中根本不存在,以下为 2021-5-17 GitHub 仓库搜索截图,使用的关键词为ci_,可见,连个影子都没有。
    GitHub 仓库搜索截图,使用的关键词为 ci_
    不过,这个方法可以使用put_object_from_local_file()方法代替,各项参数均不需改变。
  2. 上传时添加盲水印的接口,腾讯云在 盲水印的API文档 里提到了 “图片上传时添加盲水印的请求包与 PUT Object 接口一致”,顺着链接找到 PUT Object 接口文档,在“响应 - 响应体”部分,腾讯云的文档明明白白地写着 “此接口响应体为空。” ,而此处 python 示例代码,却使用了两个变量接住put_object_from_local_file()的返回值。
    在这里插入图片描述
    这样会直接导致 python 报出ValueError: too many values to unpack的异常,删去一个变量之后恢复正常。

这两个问题导致了我在使用此服务时产生了很多疑惑,走了不少弯路,但愿在你看到本文章的时候,已经不存在这两个问题了。

代码

  1. 使用之前确保开通了腾讯云的 对象存储服务(COS) 以及 数据万象服务,下面代码的 bucketNameregion参数需要填你自己在 COS 中开的桶的参数
  2. 下面的 Demo 是假设你在某个 bucket 里面的根目录已经上传了一张叫watermark.png的水印图,并且访问控制设为了公有读(反正就是不通过特别的鉴权就能访问到 COS 里面存的水印图),并且watermark.png水印图在程序目录下也有一份
  3. 此 Demo 中的盲水印模式为 type2

addWatermark.py

添加盲水印

# -*- coding=utf-8
import sys

from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client
from PIL import Image
import base64

secret_id = '用户的secret_id'  # 替换为用户的secret_id
secret_key = '用户的secret_key'  # 替换为用户的secret_key
region = '用户的region'  # 替换为用户的region
token = None  # 使用临时密钥需要传入Token,默认为空,可不填
proxies = {
    'http': '127.0.0.1:7890',  # 替换为用户的 HTTP 代理地址
    'https': '127.0.0.1:7890'  # 替换为用户的 HTTPS 代理地址
}
# config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token)  # 获取配置对象,无Proxies
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token, Proxies=proxies)  # 获取配置对象
client = CosS3Client(config)  # 获取client对象

# 我只开了一个桶,直接全局变量了
bucketName = '用户的bucketName'

# 设定盲水印在COS中的url以及base64
watermark_url = 'http://{bucket}.cos.{region}.myqcloud.com/watermark.png'.format(bucket=bucketName,
                                                                                 region=region)
watermark_url_base64 = bytes.decode(base64.b64encode(str.encode(watermark_url)))


def mark(file_path):
    split = src_file_path.split('\\')
    file_name = split[len(split) - 1]
    split_name = file_name.split('.')
    # 设定加了盲水印之后图片的文件名
    tgt_file_name = ''
    for i in range(len(split_name)):
        if i == len(split_name) - 2:
            tgt_file_name = tgt_file_name + split_name[i] + '_format' + '.'
        elif i == len(split_name) - 1:
            tgt_file_name = tgt_file_name + split_name[i]
        else:
            tgt_file_name = tgt_file_name + split_name[i] + '.'
    # 设定加了盲水印之后图片的文件完整路径
    tgt_file_path = ''
    for i in range(len(split)):
        if i == len(split) - 1:
            tgt_file_path = tgt_file_path + tgt_file_name
        else:
            tgt_file_path = tgt_file_path + split[i] + '\\'

    # 上传时加盲水印,type为2
    print('put src image')
    response = client.put_object_from_local_file(
        Bucket=bucketName,
        LocalFilePath=file_path,
        Key='sample.png',  # 上传到桶里面,在桶里面名字叫sample.png,之后加了盲水印的图叫做format.png,这个图也会被保存在桶里面
        PicOperations='{"is_pic_info":1,"rules":[{"fileid": "format.png","rule": "watermark/3/type/2/image/' +
                      watermark_url_base64 + '" }]}',
    )

    # 下载加了水印的图片
    print('get formatted image')
    res = client.get_object(
        Bucket=bucketName,
        Key='format.png'  # 从桶里面把名字叫format.png的图下回来
    )
    res['Body'].get_stream_to_file(tgt_file_path)
    print('all finished')


if __name__ == '__main__':
    # 程序运行的时候需要加一个参数,为要加盲水印的文件路径,
    # 例:python addWatermark.py sample.png
    src_file_path = sys.argv[1]

    # 水印图的长宽必须小于要处理的图的1/8,详见https://cloud.tencent.com/document/product/436/46781
    im_src = Image.open(src_file_path)
    safe_wm_width = im_src.size[0] // 8
    safe_wm_height = im_src.size[1] // 8
    im_wm = Image.open('watermark.png')
    if im_wm.size[0] < safe_wm_width and im_wm.size[1] < safe_wm_height:
        # 一切正常,那就直接处理
        print('safe pic size')
        mark(src_file_path)
    else:
        '''
        WARNING!
        如果程序进入了这个分支,说明要加水印的图像素不够多,或者水印图不够小,不满足水印图的长宽必须小于要处理的图的1/8这个条件
        '''
        print('fail, pic size is too small')
     

extractWatermark.py

提取盲水印

# -*- coding=utf-8
import sys

from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client
from PIL import Image
import base64

secret_id = '用户的secret_id'  # 替换为用户的secret_id
secret_key = '用户的secret_key'  # 替换为用户的secret_key
region = '用户的region'  # 替换为用户的region
token = None  # 使用临时密钥需要传入Token,默认为空,可不填
proxies = {
    'http': '127.0.0.1:7890',  # 替换为用户的 HTTP 代理地址
    'https': '127.0.0.1:7890'  # 替换为用户的 HTTPS 代理地址
}
# config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token)  # 获取配置对象,无Proxies
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token, Proxies=proxies)  # 获取配置对象
client = CosS3Client(config)  # 获取client对象

# 我只开了一个桶,直接全局变量了
bucketName = '用户的bucketName'

# 设定盲水印在COS中的url以及base64
watermark_url = 'http://{bucket}.cos.{region}.myqcloud.com/watermark.png'.format(bucket=bucketName,
                                                                                 region=region)
watermark_url_base64 = bytes.decode(base64.b64encode(str.encode(watermark_url)))


def extract(file_path):
    split = src_file_path.split('\\')
    file_name = split[len(split) - 1]
    split_name = file_name.split('.')
    tgt_file_name = ''
    for i in range(len(split_name)):
        if i == len(split_name) - 2:
            tgt_file_name = tgt_file_name + split_name[i] + '_extracted_wm' + '.'
        elif i == len(split_name) - 1:
            tgt_file_name = tgt_file_name + split_name[i]
        else:
            tgt_file_name = tgt_file_name + split_name[i] + '.'

    tgt_file_path = ''
    for i in range(len(split)):
        if i == len(split) - 1:
            tgt_file_path = tgt_file_path + tgt_file_name
        else:
            tgt_file_path = tgt_file_path + split[i] + '\\'

    print('extract wm')
    response = client.put_object_from_local_file(
        Bucket=bucketName,
        LocalFilePath=src_file_path,
        Key='format.png',  # 把处理过的图上传到桶里面,在桶里面名字叫format.png,提取出的水印叫format_out.png,也保存至桶里面
        PicOperations='{"is_pic_info":1,"rules":[{"fileid": "format_out.png","rule": "watermark/4/type/2/image/' +
                      watermark_url_base64 + '" }]}',
    )

    print('get extracted wm')
    res = client.get_object(
        Bucket=bucketName,
        Key='format_out.png'  # 从桶里面把名字叫format_out.png的图下回来
    )
    res['Body'].get_stream_to_file(tgt_file_path)
    print('all finished')


if __name__ == '__main__':
    src_file_path = sys.argv[1]
    extract(src_file_path)

运行效果

我提前放在COS中的水印图,当然,这个水印图在程序目录下也需要放一份
水印图
程序目录下的文件,sample.png是待处理的图
在这里插入图片描述

加水印

python addWatermark.py sample.png

在这里插入图片描述
sample_format.png即为处理后的图

提取水印

python extractWatermark.py sample_format.png

在这里插入图片描述
sample_format_extracted_wm.png即为提取出的水印图,效果如下
提取出的水印图

最后

可能这个 Demo 中的部分代码写的并不是很好,还望轻喷,可以评论反馈

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用腾讯云盲水印服务进行图片水印添加和提取的一个Python Demo 的相关文章

随机推荐

  • 深度学习之图片转成pkl格式的训练集

    怎么使用python将文件夹下的图片转换pkl格式的训练集 首先需要读取图片和图片所属的类别 主要思路是 1 生成train Thumbs db 2 生成label Thumbs db 3 将train Thumbs db 和label T
  • Python3 爬虫教程 - 新兴网页解析利器 parsel

    1 介绍 parsel 这个库可以对 HTML 和 XML 进行解析 并支持使用 XPath 和 CSS Selector 对内容进行提取和修改 同时它还融合了正则表达式提取的功能 功能灵活而又强大 同时它也是 Python 最流行爬虫框架
  • 基于卷积神经网络CNN的多输入多输出预测,卷积神经网络CNN的回归预测,多变量输入模型。

    清空环境变量 warning off 关闭报警信息 close all 关闭开启的图窗 clear 清空变量 clc 清空命令行 导入数据 res xlsread 数据 xlsx 数据分析 num size 0 8 训练集占数据集比例 ou
  • php如何无水印解析快手,快手短视频无水印解析过程及代码

    重要 本文最后更新于2020 08 22 08 26 13 某些文章具有时效性 若有错误或已失效 请在下方留言或联系代码狗 抖音快手作为目前最大的两大视频平台 使用量是非常大的 看到某些好看的视频想要保存下来但是又有水印改怎么办呢 狗哥已经
  • Python3_MySQL数据库连接 - PyMySQL 驱动

    数据库连接 连接数据库前 请先确认以下事项 您已经创建了数据库 TESTDB 在TESTDB数据库中您已经创建了表 EMPLOYEE EMPLOYEE表字段为 FIRST NAME LAST NAME AGE SEX 和 INCOME 连接
  • 解决 github clone慢

    转载来源 方法1 代理 通常发现在github clone 代码的时候 开了小飞机也很慢 记得输入下面的命令 git config global https proxy sock5 localhost 1080 这样在操作 git 命令时才
  • Sql Server期末复习

    基础概念 数据库管理系统 是位于用户与操作系统之间的一层数据管理软件 数据库系统 由数据库 数据库管理系统 应用程序和数据库管理员组成 即 DBS DB DBMS 应用程序 DBA 数据库系统的三层模式结构 外模式 模式 内模式 模式 也成
  • 非线性控制理论、反馈线性化、系统的逆、逆系统、微分同胚

    反馈线性化方法是非线性系统控制的一个重要研究方向 在状态反馈下 可 以将一个非线性系统完全变换为一个线性系统 在此情况下 线性系统和非线性 系统的控制问题己不再有本质上的差别 状态反馈具有的这种潜力 使得反馈线 性化方法在产生的同时 也就开
  • 温室气体数据记录软件

    温室气体数据记录软件用于记录温室气体分析仪 冷阱系统 阀箱以及采样单元数据的获取及记录 其软件界面如下 在软件操作几面上部是工具栏 可以实现软件的各种操作 工具栏的排布如下所示 最左侧为 连接 工具 用于整体连接所有设备 包括分析仪 冷阱
  • MySQL数分:窗口函数

    什么是窗口函数 窗口函数在和当前行相关的一组表行上执行计算 这相当于一个可以由聚合函数完成的计算类型 但不同于常规的聚合函数 使用的窗口函数不会导致行被分组到一个单一的输出行 行保留其独立的身份 在后台 窗口函数能够访问的不止查询结果的当前
  • html怎么控制文字的行数,HTML – 最大.文字行数;这种方法可靠吗?

    我需要限制一些文本 以便它永远不会超过2行 这是我到目前为止 Here is some long text it just keeps on going and going and going Hello how are you I m f
  • 系统更新服务器 win7,win7 64位 sp1 update故障。进行系统更新则始终保持 “正在检查更新”且 - Microsoft Community...

    大家好 如题 win7 64位机子 一旦进行系统更新则 1始终保持Windows update 正在检查更新 并无限读条 2svchost exe netsvcs 则消耗1 2个g内存 且出现较多硬页错误 gt 70 而造成系统无法使用 已
  • 前端实现水波图动态效果

    来自 https blog csdn net sheng li article details 84347987 侵删
  • 地摊经济大火之后,如何从零开始摆摊创业?

    地摊经济大火之后 如何从零开始摆摊创业 分享一份新人摆摊手册 https gitmind cn app doc c29513265
  • Sqlmap的使用方法

    sqlmap是一个非常强大的sql注入检测与辅助工具 但是由于没有图形界面 基本上用起来比较麻烦 我们要了解这些语句 如下 检查注入点 sqlmap u http ooxx com tw star photo php artist id 1
  • C51——IO口配置

    I O口配置 STC89C51RC RD 系列单片机所有I O口均 新增P4口 有3种工作类型 准双向口 弱上拉 标准8051输出模式 仅为输入 高阻 或开漏输出功能 STC89C51RC RD 系列单片机的P1 P2 P3 P4 上电复位
  • 使用pandas将numpy中的数组数据保存为csv文件的方法

    如果想保存numpy中的数组元素到一个文件中 在这方面 pandas工具的使用就会让工作方便很多 下面通过一个简单的小例子来演示一下 首先 创建numpy中的数组 import numpy as np import pandas as pd
  • 面向商用活体检测平台的鲁棒性评估

    摘要 活体检测技术已经成为日常生活中的重要应用 手机刷脸解锁 刷脸支付 远程身份验证等场景都会用到这一技术 但如果攻击者利用虚假视频生成技术生成逼真的换脸视频来攻击上述场景的活体检测系统 将会对这些场景的安全性产生巨大的威胁 针对这个问题使
  • 【Oracle】导入/导出DMP文件

    一 导入dmp文件 1 打开cmd 输入sqlplus 录入账户密码 2 exit 3 输入指令 C Users Administrator gt imp hsa nt person hsa nt person 127 0 0 1 orcl
  • 使用腾讯云盲水印服务进行图片水印添加和提取的一个Python Demo

    目录 前言 起因 可略过 代码 addWatermark py extractWatermark py 运行效果 加水印 提取水印 最后 前言 首先 本文写于 2021 5 17 也许在未来的某个时间点 腾讯云盲水印服务的 Python S