Python代码学习之给图片添加文字或图片水印

2023-05-16

前言

图片加水印有什么好处?在现今的数字化时代,网络上的图片泛滥,盗图现象也越来越严重。因此,在发布文章时,为了保护自己的原创作品版权,很多人选择使用水印来保护他们的图片。这样就能更好地做到:

1.版权保护:在商业用途的照片中添加水印可以帮助保护作者的版权,防止他人未经授权使用照片。

2.品牌推广:将商业品牌、商标或公司标志添加到照片中,可以帮助提高品牌知名度和曝光率。

3.防止盗版:添加水印可以防止盗版和未经授权的使用,因为水印会明显表明该照片的版权归原作者所有。

4.标识来源:在社交媒体平台上分享照片时,添加水印可以帮助其他用户识别出照片的来源和作者。

5.保护隐私:在一些情况下,添加水印可以帮助保护照片中的个人隐私,特别是在共享照片时,可能会有人试图使用照片来滥用或伤害个人隐私。

当然防止滥用是最主要的,我是这么觉得、。

在这里插入图片描述

PIL的Image模块的基本介绍

Pillow 是 Python 中较为基础的图像处理库,主要用于图像的基本处理,比如裁剪图像、调整图像大小和图像颜色处理等。与 Pillow 相比,OpenCV 和 Scikit-image 的功能更为丰富,所以使用起来也更为复杂,主要应用于机器视觉、图像分析等领域,比如众所周知的“人脸识别”应用 。

Image模块:

Image模块是PIL最基本的模块,其中导出了Image类,一个Image类实例对象就对应了一副图像。同时,Image模块还提供了很多有用的函数。
这里只是初步学习了一些用法与实际操作。

基础函数 简介
open() 打开图片
save(“test.gif”,“GIF”) 保存(新图片路径和名称,保存格式)
show() 显示图片
size 是img图片对象的成员数据,是一个元组,包含了像素宽度和像素高度
Image.new() 生成新的图片
getpixel((1,1)) 获取像素点(1,1)三通道信息
putpixel() 设置像素点三通道信息

Python代码实现文字水印

下面咱们用Python代码讲解下怎么批量给图片添加水印,并用代码实现。

这里使用.png图片格式,

'''
  如何批量为图片添加文字水印
'''
from PIL import Image, ImageDraw, ImageFont,ImageEnhance
path=input('请输入要添加水印的图片所在路径:')
text=input('请输入水印文字:')
positionflag=int(input('请输入水印位置(0:左上角,1:左下角,2:右上角,3:右下角,4:居中):'))
alphavalue=float(input('请输入水印透明度(范围在0——1之间的1位小数):'))
#设置所使用的字体
font = ImageFont.truetype(r'simkai.ttf', 24)

# 文字水印
def textMark(img):
    try:
        im = Image.open(img).convert('RGBA') # 打开原始图片,并转换为RGB
        newImg = Image.new('RGBA', im.size, (255, 255, 255, 0)) # 存储添加水印后的图片
        imagedraw = ImageDraw.Draw(newImg) # 创建绘制对象
        imgwidth, imgheight = im.size # 记录图片大小
        txtwidth=font.getsize(text)[0] # 获取字体宽度
        txtheight = font.getsize(text)[1] # 获取字体高度

        # 设置水印文字位置
        if positionflag == 0: # 左上角
            position=(0,0)
        elif  positionflag == 1: # 左下角
             position=(0,imgheight - txtheight)
        elif  positionflag == 2: # 右上角
            position=(imgwidth - txtwidth,0)
        elif  positionflag == 3: # 右下角
            position=(imgwidth - txtwidth, imgheight - txtheight)
        elif  positionflag == 4: # 居中
            position=(imgwidth/2,imgheight/2)
        # 绘制文字
        imagedraw.text(position, text, font=font, fill="red")
        # 设置透明度
        alpha = newImg.split()[3]
        alpha = ImageEnhance.Brightness(alpha).enhance(alphavalue)
        newImg.putalpha(alpha)
        Image.alpha_composite(im, newImg).save(img,'png') # 保存图片
    except Exception as e:
        print(e)
import os
try:
    list = os.listdir(path)  # 遍历选择的文件夹
    for i in range(0, len(list)):  # 遍历文件列表
        filepath = os.path.join(path, list[i])  # 记录遍历到的文件名
        if os.path.isfile(filepath):  # 判断是否为文件
            filetype = os.path.splitext(filepath)[1]  # 获取扩展名
            if filetype == '.png':  # 判断是否为.png
                textMark(filepath) # 批量添加文字水印
    print('批量添加水印完成')
except:
    print('请输入一个有效路径……')

左上角添加水印,图例展示:
在这里插入图片描述

Python代码实现图片水印

from PIL import Image
path=input('请输入要添加水印的图片所在路径:')
imgpath=input('请输入要作为水印图片的路径:')
positionflag=int(input('请输入水印位置(0:左上角,1:左下角,2:右上角,3:右下角,4:居中):'))
alphavalue=int(input('请输入水印透明度(范围在1——10之间):'))

# 图片水印
def imgMark(img):
    im = Image.open(img) # 打开原始图片
    mark = Image.open(imgpath) # 打开水印图片
    rgbaim = im.convert('RGBA') # 将原始图片转换为RGBA
    rgbamark = mark.convert('RGBA') # 将水印图片转换为RGBA
    imgwidth, imgheight = rgbaim.size # 获取原始图片尺寸
    nimgwidth, nimgheight = rgbamark.size # 获取水印图片尺寸
    # 缩放水印图片
    scale = 10
    markscale = max(imgwidth / (scale * nimgwidth), imgheight / (scale * nimgheight))
    newsize = (int(nimgwidth * markscale), int(nimgheight * markscale)) # 计算新的尺寸大小
    rgbamark = rgbamark.resize(newsize, resample=Image.ANTIALIAS) # 重新设置水印图片大小
    nimgwidth, nimgheight = rgbamark.size # 获取水印图片缩放后的尺寸
    # 设置水印文字位置
    if positionflag == 0:  # 左上角
        position = (0, 0)
    elif positionflag == 1:  # 左下角
        position = (0, imgheight - nimgheight)
    elif positionflag == 2:  # 右上角
        position = (imgwidth - nimgwidth, 0)
    elif positionflag == 3:  # 右下角
        position = (imgwidth - nimgwidth, imgheight - nimgheight)
    elif positionflag == 4:  # 居中
        position = (int(imgwidth / 2), int(imgheight / 2))
    # 设置透明度:img.point(function)接受一个参数,且对图片中的每一个点执行这个函数,这个函数是一个匿名函数,使用lambda表达式来完成
    # convert()函数,用于不同模式图像之间的转换,模式“L”为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。
    # 在PIL中,从模式“RGB”转换为“L”模式是按照下面的公式转换的:L = R * 299/1000 + G * 587/1000+ B * 114/1000
    rgbamarkpha = rgbamark.convert("L").point(lambda x: x/alphavalue)
    rgbamark.putalpha(rgbamarkpha)
    # 水印位置
    rgbaim.paste(rgbamark, position, rgbamarkpha)
    rgbaim.save(img) # 保存水印图片

import os
try:
    list = os.listdir(path)  # 遍历选择的文件夹
    for i in range(0, len(list)):  # 遍历文件列表
        filepath = os.path.join(path, list[i])  # 记录遍历到的文件名
        if os.path.isfile(filepath):  # 判断是否为文件
            filetype = os.path.splitext(filepath)[1]  # 获取扩展名
            if filetype == '.png':  # 判断是否为.png
                imgMark(filepath) # 批量添加图片水印
    print('批量添加水印完成')
except Exception as e:
    print(e)

左下角添加图片水印,图例展示:
在这里插入图片描述

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

Python代码学习之给图片添加文字或图片水印 的相关文章

  • Mac OS 上的诗歌安装失败,显示“should_use_symlinks”

    我正在尝试使用以下命令安装诗歌 curl sSL https install python poetry org python3 但它失败了 但有以下例外 例外 此版本的 python 无法在不使用符号链接的情况下创建 venvs 下面是详
  • 如何在 Windows 64 上安装 NumPy?

    NumPy 安装程序在注册表中找不到 python 路径 无法安装 需要 Python 2 5 版本 但在注册表中未找到该版本 OK 我必须修改注册表吗 我已经修改了 PATH 以指向Python25安装目录 我可以检查一下您使用的是什么安
  • Twisted 的 Deferred 和 JavaScript 中的 Promise 一样吗?

    我开始在一个需要异步编程的项目中使用 Twisted 并且文档非常好 所以我的问题是 Twisted 中的 Deferred 与 Javascript 中的 Promise 相同吗 如果不是 有什么区别 你的问题的答案是Yes and No
  • 使用 python 中的公式函数使从 Excel 中提取的值的百分比相等

    import xlrd numpy excel Users Bob Desktop wb1 xlrd open workbook excel assignment3 xlsx sh1 wb1 sheet by index 0 colA co
  • Python - 来自 .进口

    我第一次尝试图书馆 我注意到解决图书馆内导入问题的最简单方法是使用如下结构 from import x from some module import y 我觉得这件事有些 糟糕 也许只是因为我不记得经常看到它 尽管公平地说我还没有深入研究
  • Python 中的流式传输管道

    我正在尝试使用 Python 将 vmstat 的输出转换为 CSV 文件 因此我使用类似的方法转换为 CSV 并将日期和时间添加为列 vmstat 5 python myscript py gt gt vmstat log 我遇到的问题是
  • 工作日重新订购 Pandas 系列

    使用 Pandas 我提取了一个 CSV 文件 然后创建了一系列数据来找出一周中哪几天崩溃最多 crashes by day bc DAY OF WEEK value counts 然后我将其绘制出来 但当然它按照与该系列相同的排名顺序绘制
  • 如何在 Python 中加密并在 Java 中解密?

    我正在尝试在 Python 程序中加密一些数据并将其保存 然后在 Java 程序中解密该数据 在Python中 我像这样加密它 from Crypto Cipher import AES KEY 1234567890123456789012
  • Keras:如何保存模型或权重?

    如果这个问题看起来很简单 我很抱歉 但是阅读 Keras 保存和恢复帮助页面 https www tensorflow org beta tutorials keras save and restore models https www t
  • 在 matplotlib 中的极坐标图上移动径向刻度标签

    From matplotlib 示例 http matplotlib org examples pylab examples polar demo html import numpy as np import seaborn as sbs
  • Gspread如何复制sheet

    在 Stackoverflow 上进行谷歌搜索和搜索后 我想我找不到有关如何复制现有工作表 现有模板工作表 并将其保存到另一个工作表中的指南 根据文档 有重复表 https gspread readthedocs io en latest
  • 从扫描文档中提取行表 opencv python

    我想从扫描的表中提取信息并将其存储为 csv 现在我的表提取算法执行以下步骤 应用倾斜校正 应用高斯滤波器进行去噪 使用 Otsu 阈值进行二值化 进行形态学开局 Canny 边缘检测 进行霍夫变换以获得表格行 去除重复行 10像素范围内相
  • .pyx 文件出现未知文件类型错误

    我正在尝试构建一个包含 pyx 文件的 Python 包 pyregion 但在构建过程中出现错误 检查以下输出 python setup py build running build running build py creating b
  • 使用 python 绘制正值小提琴图

    我发现小提琴图信息丰富且有用 我使用 python 库 seaborn 然而 当应用于正值时 它们几乎总是在低端显示负值 我发现这确实具有误导性 尤其是在处理现实数据集时 在seaborn的官方文档中https seaborn pydata
  • 通过索引访问Python字典的元素

    考虑一个像这样的字典 mydict Apple American 16 Mexican 10 Chinese 5 Grapes Arabian 25 Indian 20 例如 我如何访问该字典的特定元素 例如 我想在对 Apple 的第一个
  • 使用 Pandas 计算 delta 列

    我有一个数据框 如下所示 Name Variable Field A 2 3 412 A 2 9 861 A 3 5 1703 B 3 5 1731 A 4 0 2609 B 4 0 2539 A 4 6 2821 B 4 6 2779 A
  • 返回表示每组内最大值的索引的一系列数字位置

    考虑一下这个系列 np random seed 3 1415 s pd Series np random rand 100 pd MultiIndex from product list ABDCE list abcde One Two T
  • 从 NumPy 数组到 Mat 的 C++ 转换 (OpenCV)

    我正在围绕 ArUco 增强现实库 基于 OpenCV 编写一个薄包装器 我试图构建的界面非常简单 Python 将图像传递给 C 代码 C 代码检测标记并将其位置和其他信息作为字典元组返回给 Python 但是 我不知道如何在 Pytho
  • Django 与谷歌图表

    我试图让谷歌图表显示在我的页面上 但我不知道如何将值从 django 视图传递到 javascript 以便我可以绘制图表 姜戈代码 array Year Sales Expenses 2004 1000 400 2005 1170 460
  • 从 pandas DataFrame 中删除少于 K 个连续 NaN

    我正在处理时间序列数据 我在从数据帧列中删除小于或等于阈值的连续 NaN 时遇到问题 我尝试查看一些链接 例如 标识连续 NaN 出现的位置以及计数 Pandas NaN 孔的游程长度 https stackoverflow com que

随机推荐

  • github国内镜像代理【持续更新】

    整理github国内代理 xff08 镜像站 xff09 会不定期持续更新 不过由于我都是优先从gitee上找资源 xff0c 所以有时会更新的比较慢 域名更新时间备注https kgithub com2023 03 14 已失效备注 以下
  • android适配ipv6,请求慢?

    先贴一篇我们经常能搜索到的解决方案 xff1a Android 在 4G 下访问 IPV6 慢的解决方案 文章很有参考意义 xff0c 但也并不是所有请求慢的的原因 xff01 本文是另一种原因 有兴趣就继续往下看一看 使用的okhttp框
  • 总结一下__declspec(dllimport)的作用

    作者 xff1a 朱金灿 来源 xff1a http blog csdn net clever101 是时候总结一下 declspec dllimport 的作用了 可能有人会问 xff1a declspec dllimport 和 dec
  • Autojs初试

    1 环境布置 AutoJs 目前能找到的 autojs的版本是 Autojs 4 4 1 7 pro pojie 8pro 需付费 VsCode VScode 安装对应版本插件 xff0c autojs 和autojs pro需要插件不同
  • APK反编译流程学习[1]

    1 获得 classes dex classes dex是由java文件编译再通过dx工具打包而成的 将apk重命名为zip或者rar后缀 xff0c 进行解压 里面的文件基本都是乱码 xff0c 如下图 xff1a 2 使用dex2jar
  • c csv 保存函数

    include lt stdio h gt include lt stdlib h gt include lt string gt int save csv const char file path unsigned char data i
  • 坐标系变换推导(欧拉角、方向余弦矩阵、四元数)+代码解析

    一 为什么选择四元数 描述两个坐标系之间的变换关系主要有几个方法 1 欧拉角法 存在奇异性和万向锁而且三个轴旋转的顺序不好定 2 方向余弦矩阵法 翻译为Directional cosine matrix xff0c 简称DCM xff0c
  • 如何从正确的原理图生成PCB图

    首先 编译sch文件 Project 下面的第二个选项 之后生成网表文件 Design Netlist for Project 之后在PCB文件里面画板子形状 CRTL 43 M 是测量长度 选择你画的板子大小的封闭图形边界线 在Mecha
  • python中try except处理程序异常的三种常用方法

    转载自 xff1a http www pythontab com html 2013 pythonjichu 0204 210 html 如果你在写python程序时遇到异常后想进行如下处理的话 一般用try来处理异常 xff0c 假设有下
  • 好久之前看过的BOOT0与BOOT1设置问题

    好久之前看过关于BOOT0与BOOT1问题 xff0c 用于在不同地方启动 xff0c 这回又碰到了 stm32的flash读保护了 用户闪存 61 内置的flash 掉电不易失 SRAM 61 芯片的内部的RAM 就是所谓的内存 ROM
  • 论文中的引用的超链接格式

    引用自 xff1a http jingyan baidu com article 4e5b3e1952739291901e2495 html 百度经验 http jingyan baidu com article 4e5b3e1952739
  • 使用ST-Link Utility去除STM32芯片读写保护

    转载学习自 xff1a http blog csdn net hxiaohai article details 78546431 locationNum 61 10 amp fps 61 1 问题 xff1a 使用ISP J Link ST
  • I2C的 SCL和SDA为什么要上拉

    因为允许把多个I2C总线器件连接到总线上 xff0c 连接到I2C总线上的器件是漏极开路或集电极开路的 xff0c 可以实现线与功能 同时 xff0c 因为接了上拉电阻 xff0c 在总线空闲期间 xff0c SDA和SCL都是高电平 xf
  • 略谈中国软件产品化的路线图

    作者 xff1a 朱金灿 来源 xff1a http blog csdn net clever101 预计这篇要挨一些砖头 xff0c 但既然说了 xff0c 就不怕挨一些砖头 进入正题 蒙圣光大侠的一篇 软件产品化 国内IT人之痛 引发了
  • STM32的HAL库的 I2C和UART使用函数,几个好用的

    HAL StatusTypeDef I2C Write uint8 t pBuffer uint8 t DeviceAddr uint8 t RegisterAddr uint16 t NumByteToWrite uint8 t data
  • 解析一波csdn.net的图片链接

    研究一波csdn net的图片链接 例子如下 https img blog csdnimg cn 0380d37492324ec58cc898470b100679 png x oss process 61 image watermark t
  • Unity VR游戏开发干货教程:VR中的交互方式

    游戏程序 平台类型 虚拟VR 程序设计 编程语言 引擎 SDK Unity3D 2D GameRes游资网授权发布 文 王寒 在VR项目中 xff0c 我们需要在用户 凝视 某个物体时将其激活 在VRSamples中 xff0c 我们构建了
  • 面向服务器的快速应用程序开发(RAD)

    面向服务器的快速应用程序开发 RAD Visual Studio NET将极大地降低创建网络应用程序的复杂性 创建成功的网络应用程序的关键是将重点放在中间层上 商务逻辑和应用程序的大部份都出现在中间层服务器上 Visual Studio N
  • 如何删除数组中的某个元素(C/Python/Java/Go/MATLAB)

    文章目录 前言一 C Python Java Go Matlab语言优势对比二 如何删除数组中的某个元素 xff0c 在各语言中的实现1 C语言2 Python3 Java4 Go语言5 MATLAB 总结 加粗样式 前言 根据之前的文章分
  • Python代码学习之给图片添加文字或图片水印

    前言 图片加水印有什么好处 xff1f 在现今的数字化时代 xff0c 网络上的图片泛滥 xff0c 盗图现象也越来越严重 因此 xff0c 在发布文章时 xff0c 为了保护自己的原创作品版权 xff0c 很多人选择使用水印来保护他们的图