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

news2024/11/18 21:45:01

前言

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

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)

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/492435.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java基础(十九)反射机制

1. 反射(Reflection)的概念 1.1 反射的出现背景 Java程序中,所有的对象都有两种类型:编译时类型和运行时类型,而很多时候对象的编译时类型和运行时类型不一致。 Object obj new String(“hello”); obj.getClass() 例如:某些变…

ChatGPT技术如何助力汽车门店销售服务水平提升?

过往,由于线下销售过程没有数字化记录,销售顾问的销讲要点执行情况、客户在体验展车、试乘试驾等过程中的反馈,没法真实全面地记录下来,因此很难做精细化的销售管理和客户心声分析。销售沟通过程不透明、员工服务质量难评估。 在…

Docker启动多个mysql容器

原有镜像mysql5.7.41,已启动mysql容器端口3306,再启动一个端口号为3400的容器。指定用户名root,mima ,密码123456 命令: docker run --name zjfz-mysql -e MYSQL_ROOT_PASSWORD123456 -p 3400:3306 -d mysql 名字:zjfz…

【软考备战·希赛网每日一练】2023年5月5日

文章目录 一、今日成绩二、错题总结第一题 三、知识查缺 题目及解析来源:2023年05月05日软件设计师每日一练 一、今日成绩 二、错题总结 第一题 解析: 有返回消息的就是同步消息;不需要等待返回消息就可以去做其他事情的请求消息就是异步消息…

数影周报:假冒ChatGPT的恶意软件激增,谷歌开启无密码登录

本周看点:假冒ChatGPT的恶意软件激增;谷歌开启无密码登录;京东申请注册Chat相关商标;Flexport收购 Shopify Logistics...... 数据安全那些事 Meta:假冒ChatGPT的恶意软件激增 美东时间周三,Facebook的母公司…

SSM框架(SpringBoot快速构建)

简介 本文意在快速构建一个可以接受前端访问,并进行数据库查找,随后返回相关信息给前端的项目。 ssm为Spring IocSpringMVCMyBatis的缩写 Spring Ioc:管理对象的一个工厂。对象之间有依赖,相互引用Spring MVC:开发代码模式Mybatis:操作数据…

搭建网站使用轻量云服务器怎么样?

​  搭建网站实际上可以从轻量云服务器租用中受益匪浅。如果您正在为个人网站寻找更多的低成本和轻运维,您可以考虑将轻量云服务器作为一个可行的选择。它提供独享资源、独立的IP地址、专属防火墙以及比传统虚拟主机更好的安全性能。本文将介绍轻量云服务器对建站…

OBCP题目及解析

1.关于OCP中的新建告警项,告警项的所属范围包括________?(正确答案个数:2个) A. OB告警 B. 操作系统告警 C. 应用告警 D. 服务器硬件告警 E. OBProxy告警 【答案】AC 【解析】如下图所示: 2.如果Oce…

大疆无人机 MobileSDK(遥控器/手机端)开发 v4版<1>

大疆无人机飞控开发 大疆无人机SDK开发包功能概述飞行控制相机实时视频流传感器数据下载媒体文件遥控器,电池和无线链路连接应用程序和产品 v4版sdk 二次开发注册成为DJI开发者生成 App KeyAndroid 示例代码配置Android Studio项目集成创建一个新的应用配置Gradle 脚…

使用Gradle7.6+SpringBoot 3.0+java17创建微服务项目

系列文章目录 学习新版本,菜鸟一枚 会持续更新的 文章目录 系列文章目录前言一、搭建项目1.1、创建git仓库1.1.1、登录gitee,新建仓库1.1.2、得到如下命令(新建仓库使用创建git仓库 即可) 1.2、使用IDEA创建项目1.2.1、开发工具1.…

Servlet基础(创建、运行原理、API)

目录 一、创建 Servlet 项目 1、创建项目 2、引入依赖 3、创建目录 4、编写代码 5、使用 Tomact 直接运行 (打包程序、部署程序、验证程序) 二、Servlet 运行原理 1、接收请求 2、根据请求计算响应 3、返回响应 三、Servlet API 1、HttpServl…

惩治标题党,vue2监听父组件传过来的值,el-tree一键全选多个树形

vue2监听父组件传过来的值 父组件使用的动态组件&#xff0c;然后父传子 <component :is"checkedIt" :riskQuarterriskQuarter :riskYearriskYear></component> 子组件打印 console.log(riskQuarter :>> , this.$props.riskQuarter); 监听 pr…

BOM概述

目录 什么是BOM 浏览器对象模型&#xff08;Browser Object Model (BOM)&#xff09; Window对象 一些常用方法 JavaScript Window Screen Window Screen Window Screen 高度 Window Screen 可用宽度 Window Screen 可用高度 Window Screen 色深 Window Screen 像素深…

【AI实战】训练一个自己的ChatGPT

【AI实战】训练一个自己的ChatGPT 准备环境代码模型 数据集Belle下载 Belle 的开源中文数据集&#xff08;仅限研究使用&#xff0c;禁止商用&#xff01;&#xff09;清洗自己的数据集上述工作完成后&#xff0c;大概是这样子的 训练测试参考 本文使用 Alpaca-LoRA 来训练一个…

Linux_top命令

top命令是Linux系统下常用的性能分析工具&#xff0c;能够实时显示系统中各个进程的资源占用状况&#xff0c;类似于Windows的任务管理器。它是一个动态显示过程,执行该命令后,它展示的信息会将独占前台,直到用户终止该程序为止&#xff08;可以用Ctrl C终止&#xff09;。 t…

汇编仿真 — 比较大小

项目文件 文件 关于项目的内容知识点可以见专栏单片机原理及应用 的第三章 汇编 题目&#xff1a;编程实现如下功能:比较片内 RAM的30H和40H单元中两个无符号数的大小&#xff0c;并将大数存入50H&#xff0c;小数存入51H&#xff0c;若两数相等&#xff0c;则使位单元7FH置1…

内网:域内信息收集

一&#xff0c;判断是否有域 ipconfig /all systeminfo workgroup net config workstation net time /domain&#xff08;该命令有三种情况&#xff09; 1&#xff0c;存在域&#xff0c;当前用户不是域用户。 2&#xff0c;存在域&#xff0c;当前用户是域用户。 3&#xff0c…

使用dataFEED OPC Suite将西门子PLC数据转发至REST API

一 背景 在工业4.0或工业物联网的项目方案中&#xff0c;逐渐紧密融合的OT&IT技术给工业制造带来了新活力。与此同时&#xff0c;利用IT级别的协议和应用来对制造数据进行收集和分析也成为了指导工业生产和优化流程的重要力量&#xff0c;尤其是基于HTTP的轻量级协议REST …

Python---学生管理系统、hashlib模块

1. 学生管理系统 学生管理系统的数据结构设置: 一个学生信息对应一个字典 整个系统的所有学生&#xff1a;所有学生对应一个列表&#xff0c;列表中的元素全是字典 整个系统&#xff1a;一个字典, 字典中有一个key(all_student) 对应的值是所有学生; 这个字典需要做数据持久化…

从传统Java应用到现代微服务,SpringBoot入门的基础指南

目录 一. 创建SpringBoot项目1.1 使用Spring Initializr快速构建项目1.2 手动创建springboot项目 二. SpringBoot入门案例解析2.1 依赖管理特性2.2 starter场景启动器2.3 引导类自动配置 三. REST风格四. 配置文件4.1 配置文件类型4.2 YAML文件的简介与使用4.3 Value与Configur…