批量给图片添加水印

news2024/9/24 7:15:48

1 办公痛点

1. 为了维护作者版权,需要给文章中照片添加文字水印
2. 网上虽有添加水印的软件,但几乎都需要付费,且没法按照自己要求定制,像公众号、知乎等添加的文字水印的格式都是固定不可修改的
3. 如果需要批量添加,则更加费事费力

2 Python 批量给图片添加文字水印

一键处理就是爽!
利用Python可以编写个性化自定义的文字水印,而且只需编写一遍,便可永久免费重复使用!

3 代码实现

# 导入包
import os
from PIL import Image, ImageDraw, ImageFont

# image: 图片  text:要添加的文本 font:字体
# 指定的水印文字
text = '@apollo_miracle'
# 指定要使用的字体和大小;
font = ImageFont.truetype('simsun.ttc', 24)


for filename in os.listdir('./input/'):
    # 读取文件
    im_before = Image.open('./input/'+filename)
    
    # 转成RGBA模式
    # RGBA是代表Red(紅色)Green(綠色)Blue(藍色)和Alpha(透明度)。
    rgba_image = im_before.convert('RGBA')
    
    # 创建水印层
    text_overlay = Image.new('RGBA', rgba_image.size, (255, 255, 255, 0))
    
    # 开始绘制水印层
    image_draw = ImageDraw.Draw(text_overlay)
    
    # 文字的尺寸大小
    text_size_x, text_size_y = image_draw.textsize(text, font=font)
    # 设置文本文字位置
    text_xy = (rgba_image.size[0] - text_size_x, rgba_image.size[1] - text_size_y)
    # 设置文本颜色和透明度
    image_draw.text(text_xy, text, font=font, fill=(76, 234, 124, 100))

    # 合并两层
    image_with_text = Image.alpha_composite(rgba_image, text_overlay)

    # 打开图片
#     im_before.show()
#     im_after.show()
    # 转成 RGB 才能生成 JPEG 图,RNG才是四通道色彩
    im_after = image_with_text.convert('RGB')
    im_after.save('./output/'+filename)

实现效果:

4 优化代码

4.1 导入相关图片处理模块

import PIL
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

4.2 获取图片完整路径列表

import os
def getfilenames(filepath=''):
    '''
    获取图片完整路径列表
    filepath: 图片所在文件夹路径
    '''
    
    # 初始化文件列表
    filelist_out=[]      
    
    # 遍历filepath下的文件
    for filename in os.listdir(filepath):      ## os.listdir(filepath)用于获取filepath下所有文件的文件名
        fi_d = os.path.join(filepath, filename)    ## 合并为完整路径
        filelist_out.append(fi_d) # 添加到路径列表中
    return filelist_out  # 返回文件完整路径列表

4.3 批量给图片添加文字水印

def textMark(imgpath, outputpath, text, text_position='右上角', text_color='白'):
    '''
    批量给图片添加文字水印
    imgpath:图片所在文件夹路径
    outputpath:文字水印图片存放路径
    text:水印文字
    text_position:文字水印添加的位置:左上角、左下角、右上角、右下角、居中,默认是右下角
    text_color:字体颜色:黑、白、红、黄、蓝,默认是白色
    '''

    # 检查文件夹是否存在
    if not os.path.exists(outputpath):
        # 如果文件夹不存在,则创建它
        os.makedirs(outputpath)
    
    # 获取图片完整路径列表
    filelist = getfilenames(imgpath)
    
    # 批量给图片添加文字水印
    for fullfilename in filelist:
        
        # 下列3行代码用于生成添加水印后的图片路径
        temp = fullfilename.split('\\')     
        softfilename = temp[-1].split('.')[0]
        outputfilename = outputpath + '\\' + softfilename + '.jpg'
        
        # 打开图片
        img = Image.open(fullfilename)
        # 记录图片大小
        imgwidth, imgheight = img.size 
        
        # 画图
        draw = ImageDraw.Draw(img)        
        
        # 设置文字的字体
        text_size = int(imgheight / 20)
        font = ImageFont.truetype('simkai.ttf', text_size)
        
        # 设置水印文字位置
        if text_position == '左上角':
            position=(0,0)
        elif  text_position == '左下角':
            position=(0,imgheight-text_size)
        elif  text_position == '右上角':
            position=(imgwidth - text_size*len(text),0)
        elif  text_position == '右下角':
            position=(imgwidth - text_size*len(text), imgheight - text_size)
        elif  text_position == '居中':
            position=(imgwidth/2,imgheight/2)

        # 设置文字颜色
        if text_color == '黑':
            color = '#000000'
        elif text_color == '白':
            color = '#FFFFFF'
        elif text_color == '红':
            color = '#FF0000'
        elif text_color == '黄':
            color == '#FFFF00'
        elif text_color == '蓝':
            color = '#0000FF'
        else:
            print("目前仅支持:黑、白、红、黄、蓝,请输入正确的颜色!")

        # 设置文字格式
        draw.text(position, text, color, font)    
        # 将文字添加到图片上
        draw = ImageDraw.Draw(img)    
        # 转成 RGB 才能生成 JPEG 图,RNG才是四通道色彩
        img = img.convert('RGB')
        #另存图片
        img.save(outputfilename)

4.4 测试

input文件夹用于存放原照片
output文件夹用于存放添加文字水印后的照片

imgpath = './input'
outputpath = './output/右上角'
text = '@apollo_miracle'
textMark(imgpath,outputpath,text, text_position='右上角')

 5 进阶:图片水印

from PIL import Image, ImageDraw
 
def add_watermark_to_image(image, watermark):
    rgba_image = image.convert('RGBA')
    rgba_watermark = watermark.convert('RGBA')

    image_x, image_y = rgba_image.size
    watermark_x, watermark_y = rgba_watermark.size

    # 缩放图片
    scale = 5
    watermark_scale = max(image_x / (scale * watermark_x), image_y / (scale * watermark_y))
    new_size = (int(watermark_x * watermark_scale), int(watermark_y * watermark_scale))
    rgba_watermark = rgba_watermark.resize(new_size, resample=Image.ANTIALIAS)
    # 透明度
    rgba_watermark_mask = rgba_watermark.convert("L").point(lambda x: min(x, 180))
    rgba_watermark.putalpha(rgba_watermark_mask)

    watermark_x, watermark_y = rgba_watermark.size
    # 水印位置
    rgba_image.paste(rgba_watermark, (image_x - watermark_x, image_y - watermark_y), rgba_watermark_mask)

    return rgba_image
 
im_before = Image.open("123.jpg")
# im_before.show()
 
im_watermark = Image.open("watermark.jpg")
im_after = add_watermark_to_image(im_before, im_watermark)
# im_after.show()

# 转成 RGB 才能生成 JPEG 图,RNG才是四通道色彩
im_after = im_after.convert('RGB')
im_after.save('im_after.jpg')

实现效果:

 

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

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

相关文章

CentOS7使用yum命令报错

目录结构 前言使用yum命令,报错信息问题排查解决方案参考文章 前言 安装CentOS 7 虚拟机,使用yum命令报错,调查整理如下: 使用yum命令,报错信息 [rootlocalhost ~]# sudo yum install net-tools 已加载插件&#xff…

手机数据恢复照片的2个小妙招,让美好回忆存留

当手机的相册突然变得空空如也,那些昔日的美好回忆仿佛被一阵龙卷风席卷而去,你是否感到惊慌失措?别担心,今天我要为你揭示2个神奇的手机数据恢复照片的小妙招,无需复杂的技术知识,只需跟随步骤&#xff0c…

智能酒精壁炉与会所大厅的氛围搭配

智能酒精壁炉与会所大厅的氛围搭配可以创造出现代、高雅且舒适的环境,提升客人的整体体验。 以下是如何将智能酒精壁炉与会所大厅氛围相协调的几点建议: 现代化和高品位感: 智能酒精壁炉具有现代化的设计和技术特点,能够与会所大…

【育儿心得】让孩子乖乖按时睡觉的6个妙招

大家好,我是小2,一个程序员,也是一个奶爸~ 最近公司项目比较忙,经常加班到晚上12点才下班, 可是下班后发现我家娃还在“加班”玩耍,这个时候又要哄睡、陪玩,往往弄到1-2点钟才可以睡觉。着实一…

软件架构之嵌入式系统设计(2)

软件架构之嵌入式系统设计(2) 12.4 嵌入式网络系统12.4.1 现场总线网12.4.2 家庭信息网11.4.3 无线数据通信网12.4.4 嵌入式 Internet 12.5 嵌入式数据库管理系统12.5.1 使用环境的特点12.5.2 系统组成与关键技术 12.6 实时系统与嵌入式操作系统12.6.1 嵌…

Python UDP编程之实时聊天与网络监控详解

概要 UDP(User Datagram Protocol,用户数据报协议)是网络协议中的一种,主要用于快速、简单的通信场景。与TCP相比,UDP没有连接、确认、重传等机制,因此传输效率高,但也不保证数据的可靠性和顺序。本文将详细介绍Python中如何使用UDP协议进行网络通信,并包含相应的示例…

优化 Java 数据结构选择与使用,提升程序性能与可维护性

优化 Java 数据结构选择与使用,提升程序性能与可维护性 引言 在软件开发中,数据结构的选择是影响程序性能、内存使用以及代码可维护性的关键因素之一。Java 作为一门广泛使用的编程语言,提供了丰富的内置数据结构,如数组、链表、…

使用freepik的retouch功能修改图片

1、准备好需要修改的图片。 2、打开网页:Freepik Retouch - Free AI image editor 3、upload第一步的图片。 4、选择retouch选项。 5、涂抹需要修改的地方。 6、输入提示词。 点击“retouch”按钮。 看结果:

电脑登录2个微信按什么键

​ 在电脑上登录两个微信账号,可以通过同时按下Enter键(回车键)和鼠标左键双击微信图标来实现。 电脑端微信双开或多开是许多用户的需求,特别是那些需要同时管理多个账号的人。具体来说,操作方法是在未登录微信的状态…

如何高效去除论文中的AI痕迹?AI助手在此,为你指点迷津

试试这四款AI论文工具和降重技术! 在科研领域,AI写作工具如同新一代的科研利器,它们能够极大提高文献查阅、思路整理和表达优化的效率,本质上促进了科研工作的进步。AI写作工具不仅快速获取并整理海量信息,还帮助我们…

Dr4g0nb4ll靶机

信息收集 使用arp-scan生成网络接口地址,查看ip 输入命令: arp-scan -lnmap扫描端口开放 TCP 输入命令: nmap --min-rate 10000 -p- 192.168.187.184 //以最低10000的发包速率扫描全部端口可以看到目标只开放http的22和80端口 UDP …

应变与几何方程——弹性力学

变形协调方程 正应变的表达式:切应变的表达: 考虑坐标位移移动造成的增量 应变——考虑物体的变形的剧烈程度 正应变——微元线段长度的变化 剪应变——两微元所夹角度的变化 正应变——拉伸为正,压缩为负 剪应变——夹角减小为正&#x…

2024最新【内网隐蔽扫描,Nmap高级用法】(非常详细)零基础入门到精通,收藏这一篇就够了

前言 Nmap(Network Mapper)是一款开源免费的网络发现和安全审计工具,主要用于扫描目标主机的开放端口、操作系统类型、启用的服务等信息。以下是Nmap的一些常见使用介绍 Nmap的常见使用介绍 「主机发现」:Nmap可以通过发送不同类…

利用 API 接口进行自动代码生成的最佳实践

在 API 开发过程中,开发人员经常面对大量冗余代码的挑战。每个 API 都需要类似的验证逻辑、错误处理以及数据解析,这不仅消耗时间而且容易出错。 自动化代码生成的必要性 提升开发效率 自动化代码生成能节省大量时间。开发者无需重复编写相似代码&…

彻底搞懂前端跨域解决方案

目录 1浏览器的同源策略 1.1同源策略概述 1.2什么是源(origin)? 2跨域会受到哪些限制 2.1限制DOM访问 2.2限制Cookie访问 2.3限制Ajax获取数据 3几个注意点 4CORS 解决 Ajax 跨域问题 4.1CORS 概述 4.2CORS 解决简单请求跨域 4.…

骑士人才系统74cms专业版实现本地VUE打包和在线升级方法以及常见问题

骑士人才系统我就不多说了目前来说我接触的人才系统里面除了phpyun就是骑士人才了,两个历史都很悠久,总起来说功能方面各分伯仲,前几期我作过Phpyun的配置教程这次我们针对骑士人才系统说说怎么使用VUE源码本地一键打包后台和在线升级方式&am…

基于java+springboot+vue实现的新闻稿件管理系统(文末源码+Lw)109

基于SpringBootVue的实现的新闻稿件管理系统(源码数据库万字Lun文流程图ER图结构图演示视频软件包) 系统功能: 新闻稿件管理系统管理员功能有个人中心,用户管理,记者管理,审批员管理,新闻分类…

GLM-4-9B 支持 Ollama 部署

ollama的安装我们在前面已经介绍了,现在我们看下GLM-4-9B的使用 GLM-4-9B 是智谱 AI 推出的最新一代预训练模型 GLM-4 系列中的开源版本。在语义、数学、推理、代码和知识等多方面的数据集测评中, GLM-4-9B 在各项能力上均表现出卓越的能力。 具体可参见…

品牌电商价格管控的方法与选择

电商平台的蓬勃发展为众多品牌开辟了线上渠道的流通机遇。随着品牌经销渠道的持续拓展,越来越多的品牌不得不应对线上乱价、低价、窜货、假货等一系列渠道问题。那么,如何对电商价格实施有效的管控?品牌是应当自行组建团队专门负责&#xff0…

不同型号的GD32 MCU如何区分?

大家是否碰到过以下应用场景:同一套软件代码希望跑在不同型号的GD32 MCU中,但有些地方需要根据MCU型号进行调整?或者上位机或其他MCU与GD32 MCU通信时需要知道对应的MCU型号是哪个? 此时,我们就需要了解如何获取以及区…