完整代码
python
# 找到个可以下载免费字体的网站https://font.chi删除我naz.com/mi删除我anfei.html
from PIL import Image, ImageDraw, ImageFont
import exifread
def 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 tags
def 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_height
border_width = logo_size[0] + text_width + border_size * 3
border_height = max(logo_size[1], text_height) + border_size * 2
border_position = ((width - border_width) // 2, height)
# 打开logo图片并调整大小
logo = Image.open(logo_path).resize(logo_size, Image.ANTIALIAS)
# 创建新的图片
new_width = width
new_height = height + border_height
new_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界面化选择图片处理,及处理多张图片的功能