python练习-图像翻转添加拍摄日期

作业:一个文件夹下面有一些相机拍摄的照片,如果照片有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)
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值