矢岛舞美 发表于 2023-5-30 15:15

python对多文件夹图片压缩,成品+源码

本帖最后由 矢岛舞美 于 2023-5-30 23:08 编辑


python代码:
import os
import sys
from PIL import Image
from concurrent.futures import ThreadPoolExecutor
import multiprocessing

def is_image_file(file):
    try:
      with Image.open(file) as img:
            return img.format in ['JPEG', 'PNG', 'BMP', 'GIF', 'TIFF']
    except IOError:
      return False

def compress_image(input_file):
    # 打开图像文件
    with Image.open(input_file) as img:
      # 获取图像的格式
      file_format = img.format

      try:
            # 保存压缩后的图像
            img.save(input_file, format=file_format, optimize=True)
      except OSError:
            # 如果遇到缺少 EXIF 信息的情况,重新保存图像
            img.save(input_file, format=file_format, optimize=True, exif=b'')

    print(f"图像已成功压缩: {input_file}")

def compress_images_in_folders(thread_count):
    image_files = []

    # 遍历文件夹,找到所有图像文件
    for root, _, files in os.walk(os.getcwd()):
      for file in files:
            input_file = os.path.join(root, file)

            # 检查文件扩展名
            _, ext = os.path.splitext(input_file)
            if ext.lower() in ['.jpg', '.jpeg', '.png', '.bmp', '.gif', '.tiff']:
                if is_image_file(input_file):
                  image_files.append(input_file)

    # 使用线程池进行图像压缩
    with ThreadPoolExecutor(max_workers=thread_count) as executor:
      executor.map(compress_image, image_files)

if __name__ == "__main__":
    thread_count = multiprocessing.cpu_count()
    print(f"使用 {thread_count} 个线程进行图像压缩")
    compress_images_in_folders(thread_count)

成品地址:https://wwqb.lanzout.com/iGGT00xpr0ub   密码:2big

使用方法:放到要处理的文件夹,双击即可运行,比如:A文件夹下有B、C、D、E、F文件夹,将软件放到A目录下,即可对BCDEF下的图片进行压缩并对图片进行原位替换。

矢岛舞美 发表于 2023-5-30 22:37

Siono01 发表于 2023-5-30 17:48
谢谢分享。 顺便问一下这个可以压缩tga格式的嘛 这种压缩会不会损坏原始的的画质和质量的啊谢谢

那种十多M的图压缩之后看不出有啥损失,几百k的压到几十k会肉眼可见的有画质损失,我主要是压缩一些写真图,还有就是放在网站上的图

liaoyikai100 发表于 2023-6-27 14:10

import os
from PIL import Image
from concurrent.futures import ThreadPoolExecutor
import multiprocessing


def is_image_file(file):
    try:
      with Image.open(file) as img:
            return img.format in ['JPEG', 'PNG', 'BMP', 'GIF', 'TIFF']
    except IOError:
      return False


def compress_image(input_file, output_file):
    # 打开图像文件
    with Image.open(input_file) as img:
      # 获取图像的格式
      file_format = img.format

      try:
            # 保存压缩后的图像
            img.save(output_file, format=file_format, optimize=True)
      except OSError:
            # 如果遇到缺少 EXIF 信息的情况,重新保存图像
            img.save(output_file, format=file_format, optimize=True, exif=b'')

    print(f"图像已成功压缩: {output_file}")


def compress_images_in_folders(thread_count):
    # 获取用户输入的文件夹路径
    folder_path = input("请输入要压缩图像文件所在的文件夹路径:")

    # 遍历文件夹,找到所有图像文件
    image_files = []
    for root, _, files in os.walk(folder_path):
      for file in files:
            input_file = os.path.join(root, file)

            # 检查文件扩展名
            _, ext = os.path.splitext(input_file)
            if ext.lower() in ['.jpg', '.jpeg', '.png', '.bmp', '.gif', '.tiff']:
                if is_image_file(input_file):
                  image_files.append(input_file)

    # 使用线程池进行图像压缩
    with ThreadPoolExecutor(max_workers=thread_count) as executor:
      for input_file in image_files:
            # 生成压缩后的文件名
            output_file = os.path.splitext(input_file) + "_compressed" + os.path.splitext(input_file)

            # 检查是否已存在同名文件
            if os.path.exists(output_file):
                i = 1
                while os.path.exists(output_file):
                  output_file = os.path.splitext(input_file) + f"_compressed_{i}" + os.path.splitext(input_file)
                  i += 1

            executor.submit(compress_image, input_file, output_file)


if __name__ == "__main__":
    thread_count = multiprocessing.cpu_count()
    print(f"使用 {thread_count} 个线程进行图像压缩")
    compress_images_in_folders(thread_count)

更新一版手动选择路径并不替换源文件

Siono01 发表于 2023-5-30 17:48

谢谢分享。 顺便问一下这个可以压缩tga格式的嘛 这种压缩会不会损坏原始的的画质和质量的啊谢谢

111wdw 发表于 2023-5-30 18:19

这个软件很强大,值得收藏

jmsdqwl 发表于 2023-5-30 18:30

   py 不会 php会

ppplp 发表于 2023-5-30 21:11

听起来好像很牛Q的样子

Alice27 发表于 2023-5-30 22:10

谢谢分享,已收藏,辛苦啦

dcyxiaoxue 发表于 2023-5-31 07:26

辛苦了    收藏一下

nccdap 发表于 2023-5-31 08:59

保存了,研究学习

bjlaoge 发表于 2023-5-31 11:22

不错,很好用
页: [1] 2 3 4 5 6
查看完整版本: python对多文件夹图片压缩,成品+源码