Python——添加照片边框

该博客介绍了如何使用Python为照片添加边框,并展示原图与添加边框后的效果。通过弹窗选择图片,获取图片的EXIF信息,包括时间、相机型号等,然后在边框中显示这些信息。博客详细讲述了从获取文件路径、创建文字图片、创建边框到最终保存处理后图片的整个过程。
摘要由CSDN通过智能技术生成

原图:

在这里插入图片描述

添加边框后:

在这里插入图片描述添加边框会读取照片的exif信息如时间、相机型号、品牌以及快门焦段等信息,将他们显示在下面的边框中。

获取当前py文件路径

import os
#get path that py file located
def Get_Currentpath():
    file_path = os.path.abspath(__file__)
    dir_path = os.path.dirname(file_path)
    return dir_path

弹窗获取所选择文件路径

如下图使用tkinter库掉出弹窗选择指定图片,并获取所选择图片的绝对路径

在这里插入图片描述

import tkinter 
#get file path that choosed
def Get_FilePath():
    root = tkinter.Tk()
    root.withdraw()
    f_path = filedialog.askopenfilename()
    return f_path

弹窗获取用户所选择的保存路径

将处理后的图片存储到所选的路径并指定文件名

在这里插入图片描述

def save_filePath():
    # 创建文件对话框
    root = tkinter.Tk()
    root.withdraw()
    # 弹出保存文件对话框
    file_path = filedialog.asksaveasfilename(defaultextension=".jpg", filetypes=[("JPG File", "*.jpg"), ("PNG file","*.png"),("All Files", "*.*")])
    print(file_path)
    # 如果用户选择了文件路径,则返回路径
    if file_path:
        return file_path
    else:
        pass

创建文字图片

def createfond(size=160,str=' ',color=(0,0,0)):
    lopath = Get_Currentpath()
    fondpath = lopath+r'\material\方正楷体简体.TTF'
    dignum=0
    alphanum=0
    othernum=0
    for i in str:
        if i.isdigit():
            dignum+=1
        elif i.isalpha():
            alphanum+=1
        else:
            othernum+=1`在这里插入代码片`
    othernum = len(str)-dignum
    x=int(dignum*size*0.6)+int(alphanum*size*0.6)+int(othernum*size*0.5)
    y=int(size*1.2)
    img = Image.new("RGBA",(x,y),'white')
    draw = ImageDraw.Draw(img)#创建一个绘画对象
    fnt = ImageFont.truetype(fondpath,size)
    draw.text((0,0),str,fill=color,font=fnt)
    #img.show()
    return img,x,y

获取字体ttf文件路径

fondpath = lopath+r'\material\方正楷体简体.TTF'

计算文字所占用的空间大小从而生成合适大小的image图像

   x=int(dignum*size*0.6)+int(alphanum*size*0.6)+int(othernum*size*0.5)
   y=int(size*1.2)
   img = Image.new("RGBA",(x,y),'white')

使用imageDraw 和 ImageFont方法在image图像上写文本

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

draw = ImageDraw.Draw(img)#创建一个绘画对象
fnt = ImageFont.truetype(fondpath,size)
draw.text((0,0),str,fill=color,font=fnt)

生成文字图片如下
在这里插入图片描述

最后返回的是处理好的文本图像变量和图像的长和高

return img,x,y

创建边框

#creat the border
def CreateBorder(logopath,color = (255,255,255)):
    Src_path = Get_FilePath()
    pictype = picturetype.picturesize.size_16_9
    img = Image.open(Src_path)
    #get exif data
    exif_dict = piexif.load(Src_path)
    exif_bytes = piexif.dump(exif_dict)
    exif_mes = img._getexif()
    # 获取时间信息
    if "Exif" in exif_dict:
        exif_data = exif_dict["Exif"]
        #拍摄日期
        if piexif.ExifIFD.DateTimeOriginal in exif_data:
            datetime_original_0 = str(exif_data[piexif.ExifIFD.DateTimeOriginal].decode("utf-8"))
            #print("DateTimeOriginal:", datetime_original)
            datetime_original = datetime_original_0.replace(':','.',2)
            datetime_original = datetime_original[0:10]
            print(datetime_original)
        else:   
            datetime_original = ' '
        #焦距
        if piexif.ExifIFD.FocalLength in exif_data:
            FocalLength = str(int(exif_data[piexif.ExifIFD.FocalLength][0]/100))+"mm"
            #print("focal length:",FocalLength)
        else:
            FocalLength = ' '
        #ISO
        if piexif.ExifIFD.ISOSpeedRatings in exif_data:
            ISO = 'ISO'+str(exif_data[piexif.ExifIFD.ISOSpeedRatings])
            #print("ISO:",ISO)
        else:
            ISO = ' '
        #快门时间
        if piexif.ExifIFD.ExposureTime in exif_data:
            exposure_time = exif_data[piexif.ExifIFD.ExposureTime]
            shutter_speed = exposure_time[0] / exposure_time[1]
            shutter_speed = int(1/shutter_speed)
            shutter_speed = '1/'+str(shutter_speed)+'s'
        else:
            shutter_speed = ' '
        #光圈
        if piexif.ExifIFD.FNumber in exif_data:
            f_number = exif_data[piexif.ExifIFD.FNumber]
            fnumber = 'f/'+str(int(f_number[0] / f_number[1]))
            #print("光圈",fnumber)
        else:
            fnumber = ' '
        #镜头品牌
        if piexif.ExifIFD.LensMake in exif_data:
            lensmaker = exif_data[piexif.ExifIFD.LensMake].decode("utf-8")
            #print('镜头品牌:',lensmaker)
        else:
            lensmaker = ' '
        #镜头型号
        if piexif.ExifIFD.LensModel in exif_data:
            lensmodel = exif_data[piexif.ExifIFD.LensModel].decode("utf-8")
            #print("镜头型号",lensmodel)
        else:
            lensmodel = ' '

        camera_model = str(exif_dict[
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值