美文网首页
【校园杂工】Python脚本处理档案图片之二

【校园杂工】Python脚本处理档案图片之二

作者: 少儿创客 | 来源:发表于2019-03-19 13:08 被阅读0次

    下午在玩儿狼人杀,作为萌新,每个汉字都听得懂,但是连在一起真的不知道是什么意思,而且各位大神刻意不搞我,穷极无聊之下只好把之前的文章写完。不过狼人杀这东东好烧脑,完全没有搞懂逻辑在哪里啊。

    图片处理

    处理档案图片中,最核心的操作就是把图片从原来的大图裁剪为小图,裁剪图片需要用的第三方库为pillow库,安装方法如下:

    pip install pillow
    

    像pillow这种非常程序的库,在readthedocshttps://pillow.readthedocs.io/ 有详细的文档的,python的第三方库实在是太多了,所以学会看文档是非常重要的。

    打开图片

    我们先来完成最核心的内容,完成图片的裁剪。首先我们如何用pillow打开并显示图片,注意Python文件main.py是跟我所有的图片是在同一个文件夹下的:

    main.py
    明白文件结构有助于加载图片。
    from PIL import Image
    
    # 加载图片,注意路径
    img = Image.open('LXM_0216.JPG')
    img.show()
    

    运行程序,会弹出一个窗口显示图片,我们先从PIL中导入Image模块,然后调用Images模块中的open方法打开图片以便于进行后面的操作,open方法的参数就是图片的路径,当然这里只是告诉大家如何用pillow库加载图片,真正处理的时候不需要调用show方法显示图片。

    我们要裁剪图片,就需要知道图片原来的图片:

    from PIL import Image
    
    # 加载图片,注意路径
    img = Image.open('LXM_0216.JPG')
    w, h = img.size
    print(w, h)
    

    运行程序,输出结果如下:

    D:\coding\docs\images>python main.py
    3696 2448
    

    我们调用open方法打开图片,得到图片对象,图片对象有一个size属性,以元组的形式保存了图片的尺寸,第5行w, h = img.size这种写法是Python对于多个元素复制的方法,img.size指为(3696, 2448),用这种方法可以分别给wh复制,分别代表图片的宽和高,我们用print语句打印w和h也证明了这一点。

    裁剪图片

    pillow库实在是太强大了,对于常见的图片操作都提供了相应的方法,我们可用thumbnail方法用来得到图片的缩略图,我们用Python的内置函数help来看下thumbnail方法是怎么用的:

    from PIL import Image
    
    # 加载图片,注意路径
    img = Image.open('LXM_0216.JPG')
    w, h = img.size
    print(help(img.thumbnail))
    

    open方法返回的图片对象有一个thumbnail方法得到图片的缩略图,我们用help方法也可以很清晰的看到thumbnail方法的用法,第1个参数是缩略图的尺寸,也是个元组,类似于坐标的数对。

    其实吧,在交互式命令行摸索pillow库的使用也是非常方便的,感兴趣的可以自己尝试,我们把图片的宽和高都变为原来的一半,为了简单起见,我们把裁剪后的图片放到当前目录,并且给图片文件名加一个thumbnail:

    from PIL import Image
    
    # 加载图片,注意路径
    img = Image.open('LXM_0216.JPG')
    w, h = img.size
    img.thumbnail((w//2, h//2))
    img.save('thumbnail_LXM_0216.JPG')
    

    我们把宽度和高度都重新设置为原来的一半,并且调用img对象的save方法保存裁剪后的图片,文件名加一个thumbnail前缀,运行程序,看下保存所有图片的文件夹:

    生成缩略图
    然后我们就可以根据文件名排序,然后挑出所有的缩略图。
    看下图片的属性:
    图片属性
    然后看详细信息:
    详细嘻嘻
    注意图片尺寸的变化,除了尺寸的变化,其实水平和垂直分辨率也发生了变化,这个跟thumbnail方法的第2个参数有关系:
    第2个参数
    第2个参数决定了生成缩略图是如何重新对图片取样的。

    兄台可能觉得,这很不自动化啊,充其量是半自动啊,但是饭要一口一口的吃啊,我们先完成最核心的功能,然后逐步迭代优化,直到完全满足我们的需求,实现全部的自动化,因为最开始的时候,我们只需要一个能够工作,提高我们工作效率,帮我们完成80%的重复性工作就好了,因为如果你要实现全部的自动化的话,可能需要耗费你80%的时间,开始的时候没有必要花80%的时间完成20%的功能的,我们要用20%的时间完成80%的功能的。我喜欢的是linux的软件设计哲学,瑞士军刀,小而巧,用各种小工具帮助我们完成任务,我们不需要vs studio这样的巨无霸*。

    我们已经实现了加载图片,裁剪并另存缩略图了,接下来,我们只需要用上节课讲的知识点,遍历所有图片并且得到缩略图就可以了。

    遍历所有图片

    from PIL import Image
    import os # 导入os模块
    # 加载图片,注意路径
    # img = Image.open('LXM_0216.JPG')
    # w, h = img.size
    # img.thumbnail((w//2, h//2))
    # img.save('thumbnail_LXM_0216.JPG')
    # 利用os模块的listdir方法得到当前文件夹
    # 下所欲的图片
    for file in os.listdir():
        # file代表是当前文件夹下
        # 的文件名,listdir得到的是
        # 包含当前文件夹所有文件文件名的
        # 列表
        img = Image.open(file)
        w, h  = img.size
        img.thumbnail((w//2, h//2))
        img.save('thumbnail_' + file)
    

    大家注意到我的注释,如果代码不熟悉的情况下,可以把处理单张图片的代码注释掉,然后写for循环,for循环内部是处理单张图片的代码,所以我们就比照着前面的代码,写出处理每张图片的代码。

    运行代码,查看代码的运行结果:

    代码运行结果

    woao,好酷啊可以看到,生成了所有图片的缩略图。

    小结

    本文带领大家用pillow库处理图片并得到缩略图,然后用os模块的listdir方法得到当前文件夹下所有的图片并处理所有的图片。

    问题

    D:\coding\docs\images>python main.py
    Traceback (most recent call last):
      File "main.py", line 9, in <module>
        img = Image.open(file)
      File "C:\Users\xpro\AppData\Local\Programs\Python\Python37\lib\site-packages\PIL\Image.py", line 2687, in open
        % (filename if filename else fp))
    OSError: cannot identify image file 'main.py'
    

    代码报错,不能确定图片文件main.py,所以我们在处理图片的时候要加一个判断,判断文件是不是图片,我们只需要判断文件的后缀是不是JPG就可以了:

    from PIL import Image
    import os # 导入os模块
    
    for file in os.listdir():
        if file.endswith('JPG'):
            img = Image.open(file)
            w, h  = img.size
            img.thumbnail((w//2, h//2))
            img.save('thumbnail_' + file)
    

    字符串的endswith方法是用于判断字符串是不是以某个字符串结尾,这里我们判断代表文件名的遍历file是不是以JPG结尾,用来判断listdir方法返回的包含所有文件名的列表中,每个文件名是不是JPG,也就是文件名代表的文件是不是图片,我们只处理图片文件,注意,这样还是有些问题的,希望有人看到,并求留言谢谢。

    如果觉得文章还不错,点个好看,如果觉得真的很不错,麻烦转发下,如果觉得真的是太棒了,请转发到群(这么好的文章难道要我自己转发吗,不应该赶快让你们的朋友看到吗)谢谢。

    PS:看他们玩儿狼人杀,感受到智商的碾压,感觉自己像是个傻子。。。真的是玩儿到大脑缺氧,每个人发言都好长啊

    双PS:大神说,狼人杀是个会议游戏,你要去说服别人,然后提醒萌新,如果在职场balabala。。。。。。,好可怕的大神,真是非常激烈的游戏了。

    叒PS:之前github的使用,只有东营的胡莹老师完成了:

    胡莹老师

    相关文章

      网友评论

          本文标题:【校园杂工】Python脚本处理档案图片之二

          本文链接:https://www.haomeiwen.com/subject/wqmumqtx.html