批量处理照片软件
批量处理照片软件
实现功能:
1、指定大小
2、指定照片保存KB大小
3、照片处理日志
无法转换背景颜色,我的算法比较落后效果不好。
我只提供源码,封装程序不提供,有能力的可以自己动手,python。
照片处理工具
使用说明:
一、把照片放在原始照片文件夹中

二、直接运行程序

三、选择你需要的照片尺寸,输出数字再回车。1-3是已经设计好尺寸,即为显示尺寸。4是自己输入尺寸,选择4后自己手动输入尺寸,格式为 100x200 x是小写X

四、选择你需要照片的最大KB,输出数字再回车。如小于100则可以写99

五、批量输出照片的照片在输出文件夹中查看。要看下日志,看是否有没转成功的,以及照片最终大小。部分照片可能会超过要求的KB,日志都有记录。

提示一:该程序无法更换背景颜色,只能批量输出标准尺寸照片,以及限定KB。更换底色可以在微信小程序标准证件照中完成。
提示二:水平有限,发现当自定义很怪的参数,会有部分照片转换失败,比如size:1000x2500,大小只允许50kb,推测报错的原因无法生成只有50kb以内的这么大的照片。当然没转成功的都可以查看日志,手动去专业软件转。
升级日志:
V1.3
增加指定照片小于KB数量
V1.2
1、增强适配性,输出照片的尺寸可以手动选择和自定尺寸输出。
V1.1升级文档
1、解决原始照片无法打开报错问题。
2、加入运行日记,记录运行过程,修改图片失败的图片名字。保存在输出照片文件中。运行日志如下:
Pythony源码: V1.3版本
from PIL import Image
import os
import logging
import sys
import time
def resize_images(input_folder_path, output_folder_path, size, max_size_kb):
if not os.path.exists(output_folder_path):
os.mkdir(output_folder_path)
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
file_handler = logging.FileHandler(os.path.join(output_folder_path, "运行日志.csv"))
file_handler.setLevel(logging.INFO)
formatter = logging.Formatter('%(message)s')
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
processed_count = 0
skipped_count = 0
error_count = 0
output_size_kb_count = 0
for filename in os.listdir(input_folder_path):
input_image_path = os.path.join(input_folder_path, filename)
valid_extensions = ('.jpg', '.jpeg', '.png', '.bmp', '.gif')
if not input_image_path.lower().endswith(valid_extensions):
skipped_count += 1
logger.info(f"已经处理 {filename}")
continue
try:
with Image.open(input_image_path) as original_image:
width, height = original_image.size
resized_image = original_image.resize(size)
output_image_path = os.path.join(output_folder_path, os.path.splitext(filename)[0] + '.jpg')
# 检查输出文件大小是否超过指定大小,如果超过则降低质量
while os.path.exists(output_image_path) and os.path.getsize(output_image_path) > max_size_kb * 1024:
quality = resized_image.info['quality']
if quality > 5:
quality -= 5
resized_image.save(output_image_path, 'JPEG', quality=quality)
else:
try:
resized_image.save(output_image_path, 'JPEG')
except OSError:
output_image_path = os.path.join(output_folder_path, os.path.splitext(filename)[0] + '.png')
resized_image.save(output_image_path, 'PNG')
with Image.open(output_image_path) as png_img:
if png_img.format == 'PNG':
if png_img.mode != 'RGB':
png_img = png_img.convert('RGB')
os.remove(output_image_path)
output_image_path = os.path.splitext(output_image_path)[0] + '.jpg'
png_img.save(output_image_path, 'JPEG')
output_size_kb = os.path.getsize(output_image_path) / 1024
if output_size_kb > max_size_kb:
output_size_kb_count += 1
logger.info(f"已经处理 {filename}({output_size_kb:.2f} KB),KB已经无法再降")
else:
logger.info(f"已经处理 {filename}({output_size_kb:.2f} KB)")
processed_count += 1
except Exception as e:
error_count += 1
logger.error(f"错误图片 {filename}")
logger.info(f"已经处理 {processed_count} 照片, KB超标 { output_size_kb_count} 张照片,未读取 {skipped_count} 照片, 发现 {error_count} 错误图片.")
print(f"已经处理 {processed_count} 照片, KB超标 { output_size_kb_count} 张照片,未读取 {skipped_count} 照片, 发现 {error_count} 错误图片。详细信息请查看日志文件。")
if __name__ == '__main__':
input_folder_path = os.path.join(os.getcwd(), '原始照片')
output_folder_path = os.path.join(os.getcwd(), '输出照片')
print("请选择要使用的尺寸选项:")
print("1. 295x413 (1寸照片)")
print("2. 413x579 (2寸照片)")
print("3. 413x626 (大2寸照片)")
print("4. 自定义尺寸")
while True:
try:
size_option = int(input("请输入选项数字: "))
if size_option in [1, 2, 3, 4]:
break
else:
print("无效选项,请重新输入。")
except ValueError:
print("无效选项,请重新输入。")
if size_option == 1:
size = (295, 413)
elif size_option == 2:
size = (413, 579)
elif size_option == 3:
size = (413, 626)
elif size_option == 4:
while True:
try:
size_str = input("请输入自定义尺寸(格式:100x100,x是小写):")
width, height = map(int, size_str.split('x'))
size = (width, height)
break
except ValueError:
print("无效的尺寸选项,请重新输入。")
else:
print("请重新启动程序")
sys.exit(1)
while True:
try:
max_size_kb = int(input("请输入输出照片的最大大小(单位:KB): "))
break
except ValueError:
print("无效的大小选项,请重新输入。")
try:
resize_images(input_folder_path, output_folder_path, size, max_size_kb)
except Exception as e:
logging.error(f"处理照片时出错: {str(e)}")
print("处理照片时出错,请查看日志文件获取更多信息。")
sys.exit(1)
time.sleep(6)