Pythonx学习日志20200722 文件路径操作pathlib图片批量贴水印

# 四个模块分别是路径管理,图形处理,迭代模块(貌似这个东西很好玩),内存
from pathlib import Path
from PIL import Image
from itertools import chain
from io import BytesIO
import time

# 指定路径
PATH = 'E:\\image'
imagePath = Path(PATH)
startTime = time.time()
# 建立存放打上logo的图片文件夹
image_logo = imagePath.joinpath('withlogo')
image_logo.mkdir(exist_ok=True)
# 指定logo文件位置
logoFile = imagePath.joinpath('abc.png')
# 获取E:\image文件夹下(包括子文件夹)后缀为jpg的文件名字
# 如果还有其他格式的图形文件,应该可以继续叠加,我没测试,开始的时候只想着jpg文件处理
# 结果下载了几个jpeg他就罢工了,找啊找啊 找到这么个好东西,貌似他能把什么类型都加到一起去
# 这一句话就取得了全部两个类型的文件全路径.
jpgFile = chain(imagePath.rglob('*.jpeg'), imagePath.rglob('*.jpg'))

'''
关于这段当时考虑两个问题,我想把logo文件占原始文件的10% 放右下角
这样logo文件会被不停resize,如果logo文件不是在每次处理的时候都
打开一次的话,处理完一个小文件logo的size会变得特别小,如果后面还
大文件处理,logo会变成马赛克,所以每次都要重新resize,那如果每次
都重新去硬盘读取下logo文件,第一会降低处理速度,第二加大硬盘压力
刚好前段时间学word处理的时候,老师讲了下可以用内存干这个事,那就先把
logo文件存到内存 再每次从内存读取,不知道这个思路对不.
'''
logoBuffer = BytesIO()
logo = Image.open(str(logoFile))
logo.save(logoBuffer, 'png')
# 防止被处理的文件重名,还是在处理完文件重命名下吧.
k = 1
for i in jpgFile:
    # 我处理好的文件也在同一个文件夹下,所以加了个判断
    # 这个地方有点奇怪 按理来说jpgFile的文件总数应该是已经确定了,但是我运
    # 如果我不把存放处理结束的目录排除掉,他会把第一次处理结束的文件在处理一次
    # 没找到原因前先姑且把这个目录排除了算了.就一个判断的事.
    if i.parent != image_logo:
        # 打开logo文件
        logo = Image.open(logoBuffer)
        logo.convert('RGB')
        f = Image.open(i)
        # 这个是百度来的,前人发现如果文件mode不是RGB不能贴,就预先处理了下
        if f.mode == "P":
            f = f.convert('RGB')
        # 这个是把logo文件处理成被打logo文件大小的1/10
        logo = logo.resize((f.size[0] // 10, f.size[1] // 10))
        # 把logo文件贴到被处理文件的0.9位置,当然你可以写0.5 把logo搁中间
        f.paste(logo, ((int(f.size[0] * 0.9), int(f.size[1] * 0.9))), logo)
        # 保存文件 文件名字n位数长不够0补齐
        f.save(image_logo.joinpath('{:0>4}'.format(k) + i.suffix))
        k += 1
logoBuffer.close()
print('耗时{}秒!'.format(time.time() - startTime))

如果不把logo每次读取在resize结果就是这样在这里插入图片描述
在这里插入图片描述
每次读取的效果在这里插入图片描述
今天踩的坑主要有:

  • 图形mode不对,报错raise OSError(“cannot write mode %s as JPEG” % im.mode) from e 用convert搞定了.
  • 把jpg和jpeg文件都遍历出来了,不知道什么把两组文件名怎么合并,结果用itertools 一条chain搞定了.
  • logo马赛克通过每次读取文件搞定.

昨天欠的功课 今天算是晚交了.我是菜鸟我怕谁.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值