Python实现压缩图片到2M

最近疫情反复,堂姐被抽调到宣传部门发些稿件,发布平台总是要求图片上传必须为2M以下,堂姐是个电脑盲,刚好最近在看入门Python的文章,写个压缩同目录下图片到2M的程序给她,她只要把程序放到有图片的文件夹里运行就好了。我在这里记录分享下制作过程。

打开PyCharm或者VScode,写下如下代码:

(大概思路就是先找当前文件夹下有没有图片格式的文件,有的话就取出文件路径,然后按比例和质量循环不断压缩它,直到它小于2M大小,然后就创建个压缩后图片的文件夹,把压缩好的图片放进去,如果图片本身就小于2M那么就直接放到压缩后图片文件夹,这样压缩完直接把压缩后图片文件夹拷走就行了。)

import shutil
from PIL import Image
import os
from PIL.Image import Resampling

# 尺寸比例
size_ratio = 0.9
# 压缩质量
quality = 90


# 遍历文件夹压缩
def batch_compress(src_path, dist_path):
    # 遍历文件夹
    for filename in os.listdir(src_path):
        # 目录验证
        if not os.path.exists(dist_path):
            os.makedirs(dist_path)

        # 拼接完整的文件或文件夹路径
        src_file = os.path.join(src_path, filename)
        dist_file = os.path.join(dist_path, filename)

        # 如果是文件 就调用压缩
        if os.path.isfile(src_file):
            if is_image(src_file):
                # 执行压缩操作
                compression(src_file, dist_file)
            else:
                print(dist_file + " 文件不是图片,跳过!")
        # 如果是文件夹 就继续递归
        elif os.path.isdir(src_file):
            batch_compress(src_file, dist_file)


# 获取文件大小:KB
def get_size(src_file):
    size = os.path.getsize(src_file)
    return int(size / 1024)


# 文件是否为图片判断
def is_image(src_file):
    if (src_file.lower().endswith(
            ('.bmp', '.dib', '.gif', '.png', '.jpg', '.jpeg', '.pbm', '.pgm', '.ppm', '.tif', '.tiff'))):
        return True
    else:
        return False


# 压缩图片并保存
def compression(src_file, dist_file):
    try:
        # 读取原图
        src_img = Image.open(src_file)
        w, h = src_img.size
        # 重新设置图片尺寸和选项,Image.ANTIALIAS:平滑抗锯齿
        # dist_img = src_img.resize((int(w * size_ratio), int(h * size_ratio)), Image.ANTIALIAS)
        o_size = get_size(src_file)
        msg = False
        if o_size <= 2048:
            shutil.copy(src_file, dist_file)
            print(dist_file + " 无需压缩!")
        while o_size > 2048:
            dist_img = src_img.resize((int(w * size_ratio), int(h * size_ratio)), Resampling.LANCZOS)
            # 保存为新图
            dist_img.save(dist_file, quality=quality)
            src_img = Image.open(dist_file)
            w, h = src_img.size
            o_size = get_size(dist_file)
            msg = True
        if msg:
            print(dist_file + " 压缩成功!")
    except Exception as e:
        print(dist_file + " 压缩失败!异常信息:", e)


if __name__ == '__main__':
    print("=================开始执行=================")
    # 指定图片目录以及压缩后的图片目录
    infile = os.getcwd()
    outfile = os.path.join(infile, '压缩后图片')
    batch_compress(infile, outfile)
    print("=================执行结束=================")

源代码运行测试没问题,下面就是打包成可执行的程序,堂姐主要用windows系统办公,那么打包成exe可执行程序就可以了。

打包方式有多种,这里我选择pyinstaller

用pip装它(你电脑没有pip?进它官网下载去吧您訥:)pip · PyPIThe PyPA recommended tool for installing Python packages.https://pypi.org/project/pip/

装完您就打开cmd程序,运行

pip install pyinstaller

 装完您看它结尾处显示Successfully,那就是装上了;

然后您去网上找个您喜欢的ico格式的图片文件,放到py文件所在的目录,就可以开始打包了。

打开cmd,切换到py项目所在目录,运行如下命令(这里“ico.ico”是我找的图标文件,piczip.py是我的python文件)

pyinstaller -F -i ico.ico piczip.py

然后您就得到一个带着您选择图标的exe文件,把它放到您想批量压缩图片的文件夹里,双击就可以了。

Python实现压缩图片到2M_第1张图片

不愿意搭建环境,只需要可执行程序的看这里:

压缩图片到2M.exe

 

你可能感兴趣的:(Windows,Python,python)