欢迎光临散文网 会员登陆 & 注册

批量处理照片软件

2023-07-19 14:45 作者:看看直播哦  | 我要投稿

批量处理照片软件

实现功能:

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)


批量处理照片软件的评论 (共 条)

分享到微博请遵守国家法律