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下的图片进行压缩并对图片进行原位替换。 Siono01 发表于 2023-5-30 17:48
谢谢分享。 顺便问一下这个可以压缩tga格式的嘛 这种压缩会不会损坏原始的的画质和质量的啊谢谢
那种十多M的图压缩之后看不出有啥损失,几百k的压到几十k会肉眼可见的有画质损失,我主要是压缩一些写真图,还有就是放在网站上的图 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)
更新一版手动选择路径并不替换源文件 谢谢分享。 顺便问一下这个可以压缩tga格式的嘛 这种压缩会不会损坏原始的的画质和质量的啊谢谢 这个软件很强大,值得收藏 py 不会 php会 听起来好像很牛Q的样子 谢谢分享,已收藏,辛苦啦 辛苦了 收藏一下 保存了,研究学习 不错,很好用