作业:一个文件夹下面有一些相机拍摄的照片,如果照片有exif信息,则照片拍摄信息以exif信息为准;如果没有,则照片文件的创建日期就是照片拍摄的日期。要求把拍摄日期写到照片右下角。日期文字是白色或者黑色,如果右下角颜色深,就显示为白色;颜色浅,就显示为黑色。日期格式:2017年12月1日。另外,程序要自动发现倒过来的照片(风景照,天空在下),自动把照片正过来然后加字
要用汉字字体写日期。例如汉字字体可以但不限于是 c:\windows\fonts\simhei.ttf
要求日期文字紧挨右下角,字体是24号字。假定图片都是足够大,能够显示得下日期信息
这些照片文件都和.py文件在同一个文件夹下面,生成的结果,要放到创建的result文件夹里面
提示:
1) 程序中要使用中文字体,才能在图上写中文字。
搜索: ImageFont.truetype用法
windows下字体文件在 windows\fonts文件夹下
据说,Mac上的字体文件安装在
/System/Library/Fonts路径下或 /Library/Fonts路径下。
2)判断像素是否是深色的办法:
a. 取得像素三个颜色的分量 r,g,b根据公式算
brightness = (r/255 * 299 + g/255 * 587 + b/255 * 114) / 1000
如果 brightness > 0.5 就算浅色,否则算深色
b. img = Image.open("...")就能得到一个Image对象img
用img对象的 convert 函数可以把图片转换成一个灰度图,甚至二值图。
二值图的意思就是像素点的值就是0或1,那深浅就好办了
3) 获取文件时间,需要import os, import time,
搜索: os.path.getctime, 以及 time.localtime
4) 获取图片的像素点的颜色值,可以用 Image的 getpixel函数
5) 在图片上写字,需要用到 ImageDraw,以及相应的 text函数
6) 获取字符串显示的宽度和高度,要用到 ImageFont 的 getsize函数
7) 创建文件夹: os.mkdir(path)
import PIL
from PIL import Image,ImageDraw,ImageFont
import os
import time
import exifread
import datetime
def getTime(img):
try:
f=exifread.process_file(open(img,'rb'))
t = 'EXIF DateTimeOriginal'
if t in f:
tt=str(f[t])
return tt
else:
return 0
except:
return 0
images=[]
lst=os.listdir()
curPath=os.getcwd()
newPath=curPath+"\结果"
os.mkdir(newPath)
for x in lst:
if os.path.isfile(x):
if x.lower().endswith(".jpg") or x.lower().endswith(".png"):
images.append(x)
l=len(images)
for image in images:
img=Image.open(image)
w,h=img.size
t0=getTime(image)
if t0==0:
t=time.localtime(os.path.getctime(image))
year=t.tm_year
month=t.tm_mon
date=t.tm_mday
else:
t1=datetime.datetime.strptime(t0,"%Y:%m:%d %H:%M:%S")
year=t1.year
month=t1.month
date=t1.day
ntime = str(year) + "年" + str(month) + "月" + str(date) + "日"
# 确认照片是否倒过来,翻转照片
tImg=img.transpose(Image.Transpose.FLIP_TOP_BOTTOM)
p0=img.getpixel((0,0))
p1=tImg.getpixel((0,0))
b0=float((p0[0]/255*299+p0[1]/255*587+p0[2]/255*114)/1000)
b1=float((p1[0]/255*299+p1[1]/255*587+p1[2]/255*114)/1000)
pw0=img.getpixel((w-1,0))
pw1=tImg.getpixel((w-1,0))
bw0=float((pw0[0]/255*299+pw0[1]/255*587+pw0[2]/255*114)/1000)
bw1=float((pw1[0]/255*299+pw1[1]/255*587+pw1[2]/255*114)/1000)
if b0<b1 and bw0<bw1:
nImg=tImg
else:
nImg=img
# 文字字体,字号
draw = ImageDraw.Draw(nImg)
font = ImageFont.truetype(r'c:\windows\fonts\simhei.ttf', 24)
text = ntime
# 获取日期的宽度、高度
tw,th=font.getsize(text)
#确认照片右下角像素颜色是否深浅,文字白色或黑色,0深色,文字白色,255浅色,文字黑色
nImg1=nImg.convert("1")
pr=nImg1.getpixel((w-1,h-1))
#把日期加到照片右下角
if pr==0:
draw.text((w-tw, h-th), text, fill="white",font=font, align="right")
else:
draw.text((w-tw, h-th), text, fill="black",font=font, align="right")
name=newPath+"\\"+image
nImg.save(name)