欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

使用Python轻松批量压缩图片

程序员文章站 2022-05-04 12:20:25
在互联网,图片的大小对一个网站的响应速度有着明显的影响,因此在提供用户预览的时候,图片往往是使用压缩后的。如果一个网站图片较多,一张张压缩显然很浪费时间。那么接下来,我就跟大家分享一个批量压缩图片的方法,只需几行python代码,即可轻松实现图片压缩。 "查看原文" 压缩算法 用到PIL库,PIL是 ......

在互联网,图片的大小对一个网站的响应速度有着明显的影响,因此在提供用户预览的时候,图片往往是使用压缩后的。如果一个网站图片较多,一张张压缩显然很浪费时间。那么接下来,我就跟大家分享一个批量压缩图片的方法,只需几行python代码,即可轻松实现图片压缩。

使用Python轻松批量压缩图片

压缩算法

用到pil库,pil是python平台事实上的图像处理标准库,支持多种格式,并提供强大的图形与图像处理功能。使用如下命令安装:

pip install pillow

代码如下:

#图片压缩批处理
def compressimage(srcpath,dstpath):
    for filename in os.listdir(srcpath):
        #如果不存在目的目录则创建一个,保持层级结构
        if not os.path.exists(dstpath):
                os.makedirs(dstpath)
 
        #拼接完整的文件或文件夹路径
        srcfile=os.path.join(srcpath,filename)
        dstfile=os.path.join(dstpath,filename)
 
        # 如果是文件就处理
        if os.path.isfile(srcfile):
            try:
                #打开原图片缩小后保存,可以用if srcfile.endswith(".jpg")或者split,splitext等函数等针对特定文件压缩
                simg=image.open(srcfile)
                w,h=simg.size
                dimg=simg.resize((int(w/2),int(h/2)),image.antialias)  #设置压缩尺寸和选项,注意尺寸要用括号
                dimg.save(dstfile) #也可以用srcfile原路径保存,或者更改后缀保存,save这个函数后面可以加压缩编码选项jpeg之类的
                print (dstfile+" 成功!")
            except exception:
                print(dstfile+"失败!")
 
        # 如果是文件夹就递归
        if os.path.isdir(srcfile):
            compressimage(srcfile, dstfile)

方法调用

1.在该python文件所在目录新建三个目录,prepare(存放待压缩图片)、finish(压缩完成的原图)和compress(存放压缩后的图片)
2.遍历prepare目录,将图片移动到finish目录
3.遍历compress目录删除压缩图片
4.将finish中的图片全部进行压缩,对应存到compress目录

if __name__ == '__main__':
    # 遍历待加入图片
    path = os.walk("./prepare")
    for root, dirs, files in path:
        for f in files: 
            shutil.move(os.path.join(root,f),os.path.join('./finish',f))                #移动文件

    # 遍历删除压缩图片
    path = os.walk("./compress")
    for root, dirs, files in path:
        for f in files:
            os.remove(os.path.join(root, f))

    # 压缩图片
    compressimage("./finish","./compress")

完整代码

新建photo.py,复制如下代码

from pil import image
import os,shutil

#图片压缩批处理
def compressimage(srcpath,dstpath):
    for filename in os.listdir(srcpath):
        #如果不存在目的目录则创建一个,保持层级结构
        if not os.path.exists(dstpath):
                os.makedirs(dstpath)
 
        #拼接完整的文件或文件夹路径
        srcfile=os.path.join(srcpath,filename)
        dstfile=os.path.join(dstpath,filename)
 
        # 如果是文件就处理
        if os.path.isfile(srcfile):
            try:
                #打开原图片缩小后保存,可以用if srcfile.endswith(".jpg")或者split,splitext等函数等针对特定文件压缩
                simg=image.open(srcfile)
                w,h=simg.size
                dimg=simg.resize((int(w/2),int(h/2)),image.antialias)  #设置压缩尺寸和选项,注意尺寸要用括号
                dimg.save(dstfile) #也可以用srcfile原路径保存,或者更改后缀保存,save这个函数后面可以加压缩编码选项jpeg之类的
                print (dstfile+" 成功!")
            except exception:
                print(dstfile+"失败!")
 
        # 如果是文件夹就递归
        if os.path.isdir(srcfile):
            compressimage(srcfile, dstfile)

if __name__ == '__main__':
    # 遍历待加入图片
    path = os.walk("./prepare")
    for root, dirs, files in path:
        for f in files: 
            shutil.move(os.path.join(root,f),os.path.join('./finish',f))                #移动文件

    # 遍历删除压缩图片
    path = os.walk("./compress")
    for root, dirs, files in path:
        for f in files:
            os.remove(os.path.join(root, f))

    # 遍历压缩图片
    compressimage("./finish","./compress")

最后,大家只要把要压缩的图片放入prepare目录,然后执行photo.py即可。