python 对图片增加边框,logo贴图,获取图片exif参数,填写图片文本内容

完整代码

# 找到个可以下载免费字体的网站https://font.chi删除我naz.com/mi删除我anfei.html
from PIL import Image, ImageDraw, ImageFont
import exifreaddef photo_exif(image_path):f = open(image_path, 'rb')tags = exifread.process_file(f)# 打印所有照片信息,会以键值对的方法保存# for tag in tags.keys():#     print("Key: {0}, value {1}".format(tag, tags[tag]))# print(str(tags['EXIF FocalLength']) + 'mm', tags['EXIF ExposureTime'], 'ISO' + str(tags['EXIF ISOSpeedRatings']))return tagsdef add_logo_with_text(image_path, logo_path, logo_size, text1, text2, text3, font_path, font_size, font_color, border_size,border_color, output_path):# 打开原始图片image = Image.open(image_path).convert("RGB")width, height = image.size# 计算边框区域大小和位置font = ImageFont.truetype(font_path, font_size)text1_width, text1_height = font.getsize(text1)text2_width, text2_height = font.getsize(text2)text3_width, text3_height = font.getsize(text3)text_width = max(text1_width, text2_width, text3_width)text_height = text1_height + text2_height + text3_heightborder_width = logo_size[0] + text_width + border_size * 3border_height = max(logo_size[1], text_height) + border_size * 2border_position = ((width - border_width) // 2, height)# 打开logo图片并调整大小logo = Image.open(logo_path).resize(logo_size, Image.ANTIALIAS)# 创建新的图片new_width = widthnew_height = height + border_heightnew_image = Image.new("RGB", (new_width, new_height), "white")# 将原始图片复制到新图片的顶部new_image.paste(image, (0, 0, width, height))# 在新图片上绘制边框draw = ImageDraw.Draw(new_image)border_rect = (border_position[0], height, border_position[0] + border_width, height + border_height)draw.rectangle(border_rect, fill=None, outline=border_color, width=border_size)# 在边框区域内绘制logo图片logo_position = (border_position[0] + border_size, height + (border_height - logo_size[1]) // 2)new_image.paste(logo, logo_position)# 在边框区域内绘制文本text1_position = (border_position[0] + border_size * 2 + logo_size[0], height + (border_height - text_height) // 2)text2_position = (border_position[0] + border_size * 2 + logo_size[0], text1_position[1] + text1_height)text3_position = (border_position[0] + border_size * 2 + logo_size[0], text2_position[1] + text2_height)draw.text(text1_position, text1, font=font, fill=font_color)draw.text(text2_position, text2, font=font, fill=font_color)draw.text(text3_position, text3, font=font, fill=font_color)# 保存合成后的图片new_image.save(output_path)# 示例用法
# 照片路径
image_path = "DSC_1966.jpg"
# logo图片路径
logo_path = "2.png"
# logo图片大小
logo_size = (255, 255)
# 图片信息
tags = photo_exif(image_path)
text1 = "Power For."+str(tags['Image Model'])+"     "+"FL."+str(tags['EXIF FocalLength'])+"mm"+"     "+"EB."+str(tags['EXIF ExposureTime'])+"     "+"ISO."+str(tags['EXIF ISOSpeedRatings'])+"     "+"WL."+str(tags['EXIF ExifImageWidth'])+" x "+str(tags['EXIF ExifImageLength'])
text2 = "DtO." + str(tags['EXIF DateTimeOriginal']) + "     " + "By.林俊杰裤子掉了"
text3 = "尼康,  感动常在 ╰( ̄▽ ̄)╭"
# 字体路径
font_path = "siyuanyuanti.ttf"
font_size = 55
font_color = (0, 0, 0)  # 黑色
border_size = 55
border_color = (255, 255, 255)  # 白色
# 输出照片 .后缀为png为无损图片 ,jpg为压缩后的图片
output_path = "output_image.png"add_logo_with_text(image_path, logo_path, logo_size, text1, text2, text3, font_path, font_size, font_color, border_size,border_color, output_path)
print("图片已保存至:", output_path)

输出结果 

 效果图

可自行写成tk界面化选择图片处理,及处理多张图片的功能

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

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

相关文章

2023CRM排行:深度对比16款CRM

客户关系管理系统(CRM)作为数字化转型的重要载体,选择一个优秀的CRM系统将为企业未来健康增长保障。市场上CRM软件众多,但很难分清哪个适合自己,最近赶在公司选型,我对市场所有软件进行了一个调研&#xff…

单点登录是什么?

单点登录(Single Sign On, SSO)是指在同一帐号平台下的多个应用系统中,用户只需登录一次,即可访问所有相互信任的应用系统。 单点登录的本质就是在多个应用系统中共享登录状态。如果用户的登录状态是记录在 Session 中的&#xff…

异或运算.

相同为0,不同为1。 1 ^ 10 0 ^ 00 1 ^ 01 0 ^ 11性质: 0 ^ N N N ^ N 0交换、结合 a ^ b b ^ a; (a ^ b) ^ c a ^ (b ^ c); 因此异或全部的元素的结果就是那个只出现1次的元素。 实现两个值的交换,而不必使…

ES6:什么是Promise

简介 在 JavaScript 开发中,处理异步操作是一项常见的任务。以前,我们经常使用回调函数来处理异步代码,但这种方式可能导致回调地狱和难以维护的代码。ES6 引入了 Promise,这是一种更优雅、更强大的处理异步操作的方式。 本文将介…

C的魅力在于指针

原有的adrv9025 代理框架很好用,在其原有的平台上做改进

Python特征分析重要性的常用方法

前言 特征重要性分析用于了解每个特征(变量或输入)对于做出预测的有用性或价值。目标是确定对模型输出影响最大的最重要的特征,它是机器学习中经常使用的一种方法。 为什么特征重要性分析很重要? 如果有一个包含数十个甚至数百个特征的数据集,每个特征…

C#冒泡排序算法

冒泡排序实现原理 冒泡排序是一种简单的排序算法,其原理如下: 从待排序的数组的第一个元素开始,依次比较相邻的两个元素。 如果前面的元素大于后面的元素(升序排序),则交换这两个元素的位置,使…

汽车屏类产品(四):仪表Cluster

###前言 仪表Cluster/仪表盘Dashboard,作为伴随汽车诞生就存在的一个主要零部件之一,从机械到电子到数字,可以说也是逐渐发展到现在的。 目前的主流框图如下,中间processor就是主控芯片,可能有buttons/switches,有display显示屏+backlight背光,有audio->speake…

【OpenGL】四、坐标系统和摄像机

坐标转换 文章目录 坐标转换坐标系统的转换局部空间(Local Space)->世界空间(World Space)世界空间(World Space)->观察空间(View Space/View Space)裁剪空间(Clip Space)MVP矩阵 坐标系统的转换 了解坐标系统和空间变换之前需要先了解…

[Java]订单超时自动取消——实现RocketMQ+SpringBoot项目

文章目录 一、背景二、环境准备三、项目使用1、业务需求:2、实现原理3、代码实现3.1、生产端——消息发送3.2、消费端——延迟消息监听 四、保证消息消费成功 一、背景 避免用户未付款订单占用库存资源。 二、环境准备 下载安装RocketMQSpringBoot整合RocketMQ——…

线性代数-Python-01:向量的基本运算 -手写Vector -学习numpy的基本用法

文章目录 代码目录结构Vector.py_globals.pymain_vector.pymain_numpy_vector.py 一、创建属于自己的向量1.1 在控制台测试__repr__和__str__方法1.2 创建实例测试代码 二、向量的基本运算2.1 加法2.2 数量乘法2.3 向量运算的基本性质2.4 零向量2.5 向量的长度2.6 单位向量2.7 …

mybatis自定义类型控制器(TypeHandler)处理将字符串处理为集合

1. 问题: 假设这么一个场景 localurl里面的值大概这样:dwad21.jpg,dwad22.jpg,dwad.23.jpg 是一个字符串 如果我在sql表中有一个字段(local_url)是本地图片资源的多个url字符串拼接值。我想在java后端中不进行额外的转换就取值加…

【Qt控件之微调框、进度条】QSpinBox、QDoubleSpinBox、QDial、QProgressBar介绍及使用

概述 QSpinBox类提供了一个微调框小部件。 QSpinBox适用于处理整数和离散的值集(例如,月份名称);对于浮点数值,请使用QDoubleSpinBox。 QSpinBox允许用户通过点击上下按钮或按键盘上的上下箭头来增加/减少当前显示的值…

Hadoop3教程(二十三):Yarn的三大调度器

文章目录 (129)FIFO调度器(130)容量调度器特点资源分配算法 (131)公平调度器特点缺额的定义队列资源分配方式基于FIFO策略基于Fair策略资源分配算法 DRF策略 参考文献 (129)FIFO调度…

搭建react项目

一、环境准备 1、安装node 官网下载安装:https://nodejs.org/en 注: npm5.2以后,安装node会自动安装npm和npx 2、安装webpack npm install -g webpack3、安装create-react-app npm install -g create-react-app二、创建react项目 1、初…

前端用 js-file-download组件下载后端返回的pdf,word,excel文件

后端返回的pdf,word,excel的文件流导出需要让浏览器下载文件 1、安装js-file-download组件 npm install js-file-download --save 2、在对应的页面引用 import fileDownload from "js-file-download"; 3、在接口返回结果后直接调用即可 let data{id:processId,c…

MSQL系列(六) Mysql实战-SQL语句优化

Mysql实战-SQL语句优化 前面我们讲解了索引的存储结构,BTree的索引结构,以及索引最左侧匹配原则,Explain的用法,可以看到是否使用了索引,今天我们讲解一下SQL语句的优化及如何优化 文章目录 Mysql实战-SQL语句优化1.…

GDAL Creation Options设置

GDAL 手册上frmt_gtiff.html文件上找到这句话,感觉很有用,以备查阅: Creation Options TFWYES: Force the generation of an associated ESRI world file (.tfw).See a World Files section for details. RPBYES: Force the generation of a…

科技与教育的盛宴——探讨监控易在82届教装展的新机遇

在第82届中国教育装备展示会这个融合了科技与教育的盛宴上,监控易将展现其最新的教育信息化解决方案和技术创新成果。这不仅是一次产品的展示,更是一次理念、技术与需求的交流和碰撞。在这里,我们将一同探讨在科技日新月异的今天,…

GDPU 数据结构 天码行空5

一、实验目的 1.掌握队列的顺序存储结构 2.掌握队列先进先出运算原则在解决实际问题中的应用 二、实验内容 仿照教材顺序循环队列的例子,设计一个只使用队头指针和计数器的顺序循环队列抽象数据类型。其中操作包括:初始化、入队…