python给图片添加水印图片_python 给图片添加数字水印示例

2023-11-02

【实例简介】

【实例截图】

96e785ab09c830340372aed6c12bfc60.png

【核心代码】

# -*- coding: utf-8 -*-

"""

Spyder Editor

This is a temporary script file.

"""

from PIL import Image

import numpy as np

count = 85

def addWaterMark(pic, mark):

img = Image.open(pic).convert("RGB")

width, height = img.size

img = img.point(lambda i : (int(i >> 2))<< 2)

img = list(img.getdata())

mark = Image.open(mark).convert("RGB")

mark = mark.resize((width, height))

mark = mark.point(lambda i : round(i / count))

mark = list(mark.getdata())

output = [0 for i in range(len(img))]

for i in range(len(img)):

temp = []

for j in range(3):

temp.append(img[i][j] mark[i][j])

output[i] = tuple(temp)

im = Image.new("RGB", (width, height))

im.putdata(data = output)

im.save('output.png')

return

def testwatermark(pic, mark):

img = Image.open(pic).convert("RGB")

width, height = img.size

mark1 = Image.open(mark).convert("RGB")

w, h = mark1.size

mark1 = mark1.resize((width, height))

mark1 = mark1.point(lambda i : round(i / count) * count)

mark1 = mark1.resize((w, h))

mark2 = img.point(lambda i : (int(i & 3) * count))

mark2 = mark2.resize((w, h))

mark2.save('watermark2.png')

m1 = mark1.convert("L");

m2 = mark2.convert("L")

d1 = m1.getdata()

d2 = m2.getdata()

d1 = np.mat(d1) / 255.0

d2 = np.mat(d2) / 255.0

corr = np.corrcoef(d1, d2)

corr = np.mean(corr.flatten())

return corr

addWaterMark('carry.bmp', 'watermark1.png')

test = testwatermark('output.png', 'watermark1.png')

if test > 0.8:

print('水印验证成功!')

else:

print('水印验证失败!')

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

python给图片添加水印图片_python 给图片添加数字水印示例 的相关文章

  • mysql语句

    各种sql语句 一 引言 二 sql基础语句 1 sql新增语句 2 sql查询语句 3 sql修改语句 4 sql删除语句 5 sql其他语句 5 1 sql倒序 正序查询 5 2 sql表行数查询 三 sql较有深度语句 1 sql主从
  • Linux ip地址报错(Temporary failure in name resolution)活检地址检查

    1 项目健康检查报错 报错信息 java net UnknownHostException Temporary failure in name resolution 解决办法 hostname 查看主机名 hostname i 查看本机对应
  • PHPstorm必备插件推荐

    1 env files support 对 env 文件的支持 2 ignore 对 ignore 文件的支持 3 Ideolog 对 log 文件的支持 4 Chinese Simplified Language Pack 中文语言包 官
  • 抖音视频号情感类短视频爆火,背后有什么特点?有什么值得借鉴

    有一些人渐渐不联系了 不是因为淡了远了 而是没有合适的身份陪伴 没有合适的理由联络 没有合适的机会见面 只能放在心里偶尔回忆 经常想念 明明只是一张动图 但却可以让人自动脑补了早期抖音情感博主在线念白的腔调 没错 这些曾经在抖音快手风靡一时
  • 阿里犸良导出的json文件怎么使用

    犸良是什么 犸良作为一站式动效制作平台 通过海量的动效素材以及可视化编辑能力 帮助零基础的用户轻松完成动效制作 支持全平台iOS Android H5 小程序 无论是营销展位 活动页面 空状态还是产品icon 让动效更简单 官网地址 htt
  • pear-admin-flask开源后台模板(适合于毕设)

    Pear Admin Flask 开 箱 即 用 的 Flask 快 速 开 发 平 台 预 览 官 网 群聊 社区 项目简介 Pear Admin Flask 基于 Flask 的后台管理系统 拥抱应用广泛的python语言 通过使用本系
  • C# 如何向String[]字符数组插入数据

    C 如何向String 字符数组插入数据 思路 了解 由于数组是非动态的 不能进行动态的添加 思路 首先将string 字符数组转换成list 第二给list添加数据 最后把list转换成string 数组 String arrs new
  • 怎么上传文件到spark服务器上,从SFTP服务器加载文件到spark RDD

    您可以以下方式使用spark sftp库在你的程序 火花2 x的 Maven的依赖 com springml spark sftp 2 11 1 1 0 SBT依赖 libraryDependencies com springml spar
  • Effective(Modern)C++笔记01

    Effectice C 01 条款01 视C 为一个语言联邦 C 区块 blocks 语句 statements 预处理 preprocessor 内置数据类型 built in data types 数组 arrays 指针 pointe
  • 安装zookeeper集群,开启正常,但status显示./zkServer.sh :line 170:exec :java:not found

    笔者安装过很多次zookeeper集群 但是在一个新的生产环境上遇到了zookeeper的启动异常问题 可以先使用 zkServer sh start foreground 来查看详细报错信息 若发现是 zkServer sh line 1
  • Segment Anything开源项目学习记录

    一 什么是Segment Anything开源项目 Introduction We introduce the Segment Anything SA project a new task model and dataset for ima
  • 滚动页面到指定位置动画展示-Vue自定义命令-IntersectionObserver-animate.css

    最近在做公司官网 web H5 页面滚动显示出来给个小动画 之前了解的浏览器标准解决方案 不向下兼容 是 IntersectionObserver 是一个全局的侦听器 但是每个页面去做一个实例去侦听当前对象也觉得太冗余了吧 并且在vue里面
  • 逻辑分析仪的使用

    目录 逻辑分析仪与示波器的区别 逻辑分析仪 DSView 软件安装与简介 波形采集 波形分析 分析I2S协议 逻辑分析仪与示波器的区别 参考 https www bilibili com video BV1mz4y127jn spm id
  • 详解环境变量

    目录 前言 一 什么是环境变量 二 查看环境变量的方法 三 查看环境变量的内容 四 普通变量VS环境变量 五 导出环境变量 六 常见的环境变量 七 set命令 查看普通变量或环境变量 八 C C 语言中main函数中的参数 1 main函数
  • C#操作Excel总结

    0 导入命名空间 1 2 3 4 using Microsoft Office Core using Microsoft Office Interop Excel
  • 1-8、Lua编译-运行-错误信息

    1 8 Lua编译 运行 错误信息 文章目录 1 8 Lua编译 运行 错误信息 1 require函数 2 C Packages 3 错误 4 异常和错误处理 5 错误信息和回跟踪 Tracebacks 虽然我们把Lua当作解释型语言 但
  • JNDI 和 JDBC 的区别-个人理解

    公众号 BiggerBoy 分享了更多知识干货 欢迎关注 多多支持 网上关于 JNDI 和 JDBC 的定义有很多 但是都很官方不容易理解 下面是我最近查阅资料得出的心得体会 希望对你在理解上有一点点的帮助 说的不对的请指正哦 JDBC 看
  • Sharding-jdbc踩坑记录(一)

    sharding jdbc学习链接 sharding jdbc版本 2 0 3 springboot版本 2 1 5 连接池 druid 1 1 14
  • 解决Bug[Vue warn]Error in mounted hook: “Error: please transfer a valid prop path to form item“

    本文主要讲解el form里嵌套el table的报错和解决 报错 Vue warn Error in mounted hook Error please transfer a valid prop path to form item 报错

随机推荐

  • PyTorch中通过torch.save保存模型和torch.load加载模型介绍

    PyTorch中一般约定是使用 pt或 pth文件扩展名保存模型 通过torch save保存模型 通过torch load加载模型 torch save和torch load函数的实现在torch serialization py文件中
  • Java根据枚举名使用反射获取枚举值

    由于前端需要根据枚举名获取实时获取枚举值 所以通过反射去得到枚举数据 一 首先我们新建一个枚举类接口 用于之后反射使用 package com littlematch enums biz 枚举值接口定义类 public interface
  • Eclipse导入工程文件后出现红叉解决方案:

    Step1 右击工程文件名 然后点击buildPath step2 点击Library 再点击JRE System Librarystep3 双击JRE System Library 选最后一个 Workspace default JRE
  • C++ 多线程:原子操作atomic

    原子操作atomic C 多线程 原子类型 有两个线程 一个要写数据 一个读数据 如果不加锁 可能会造成读写值混乱 使用std mutex程序执行不会导致混乱 但是每一次循环都要加锁解锁是的程序开销很大 为了提高性能 C 11提供了原子类型
  • 四二拍用音符怎么表示_钢琴教学:学会这3个音符!立马解决你节奏的致命问题!...

    在学习节奏之前 我们先来了解节奏是什么 以及节奏的重要性 一切协调 平衡 有次序的进行都可以称为节奏 节奏可以独立存在 而在音乐中具体表现为 用强弱相互交替 将音的长短关系组织起来 称为节奏 许多节奏的组合在音乐进行中已经形成固定的模式 而
  • 1.3编程基础之算术表达式与顺序执行 06:甲流疫情死亡率

    1 3编程基础之算术表达式与顺序执行 06 甲流疫情死亡率 总时间限制 1000ms 内存限制 65536kB 描述 甲流并不可怕 在中国 它的死亡率并不是很高 请根据截止2009年12月22日各省报告的甲流确诊数和死亡数 计算甲流在各省的
  • java web开发一个帐号同一时间只能一个人登录

    一个帐号同一时间只能一个人登录 对于一个帐号在同一时间只能一个人登录 可以通过下面的方法实现 1 在用户登录时 把用户添加到一个ArrayList中 2 再次登录时查看ArrayList中有没有该用户 如果ArrayList中已经存在该用户
  • springboot实现各种参数校验

    springboot实现各种参数校验 简单使用 Java API规范 JSR303 定义了Bean校验的标准validation api 但没有提供实现 hibernate validation是对这个规范的实现 并增加了校验注解如 Ema
  • 【JavaWeb】JSP使用Session、Cookie实现购物车

    购物界面shop jsp 初始页面 添加商品后 在session中设置属性 重定向回到shop jsp 然后根据session的内容显示结果 Cookie设置setMaxAge可以延长session的寿命 清空购物车就是清除session
  • 基于以太坊的USDT(基于ERC-20协议发行)

    这种USDT存储在以太坊地址上 相对应的 每次转账 链上转账 时 需要消耗Gas 也就是ETH 目前 市场上的USDT绝大部分是基于比特币的USDT 基于以太坊的USDT份额很低 约3 基于TRON网络TRC20协议的USDT 存储在TRO
  • 当心互联网抢了你的饭碗

    两年前 供职于帕洛阿尔托研究中心 Palo Alto Research Center 的学者布莱恩 亚瑟 Brian Arthur 做出了一项惊人预测 未来二三十年 西方数字网络履行的功能最终将相当于美国 实体 经济的规模 亚瑟写道 或者
  • Qt 信号和槽学习

    使用一个按钮按下时 我们可能想要窗口的 close 函数被调用 这个操作可以通过设置回调函数实现 但回调函数不够直观 而且容易出现参数类型错误等问题 Qt中使用的代替方案是信号和槽机制 信号和槽 当特定的事件出现时 一个信号被发出 槽函数作
  • 探索Java8——Lambda方法引用

    管中窥豹 方法引用让你可以重复使用现有的方法定义 并像Lambda一样传递它们 在一些情况下 比起使用Lambda表达式 它们似乎更易读 感觉也更自然 inventory sort Apple a1 Apple a2 gt a1 getWe
  • 数字孪生万亿市场显现,缺的不止是硬件落地

    数字孪生是从真实世界到虚拟世界的1 1映射 它通过控制虚拟世界中的生产过程和生产设备 模拟现实世界中的工业生产 更加注重 从虚拟到真实 工业元宇宙所反映的虚拟世界不仅具有现实世界的映射 而且具有现实世界中尚未实现甚至无法实现的体验和互动 这
  • Python实现发送邮件

    SMTP模块发送普通邮件 import smtplib from email mime text import MIMEText from email header import Header 发送方邮箱 msg from 授权码 pass
  • 实习周记1:跨vlan通信

    跨vlan通信 1 拓扑图 2 要求 不同vlan的两台pc通过二层交换机实现二层互通 3 命令 H3C GigabitEthernet2 0 1 port link type hybrid 把端口模式改为hydrid H3C Gigabi
  • Sybase服务无法启动

    刚刚改完数据库的最大连接数 重启服务时 却发现服务无法启动 找了大半天的原因 终于找到了 可惜不会弄 只好有网上搜索一下 发现这种问题还比较常见 服务起不来 在应用程序事件查看器中发现有如下错误 300122 The value of th
  • 工程师的基本素质

    昨天开会 印象最为深刻的是领导的这么一句话 工程师的基本素质 专注 专心 责任 放心 真的 我没有真正意识到并做到这些 所以对于人的准则的教育是必须的 要让人认识到 职责所在 用心做事 愧对自己 洗心革面矣
  • 【调制BFSK】二进制频移键控FSK的数字调制(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 相移键控 PS K 是利用载波相位直接表示
  • python给图片添加水印图片_python 给图片添加数字水印示例

    实例简介 实例截图 核心代码 coding utf 8 Spyder Editor This is a temporary script file from PIL import Image import numpy as np count