1. 代码核心功能

批量处理指定文件夹中的图片文件,将每张图片调整为短边1080像素(保持长宽比),确保输出图片总像素约200万像素(1080p标准),处理结果保存到新文件夹。

# 导入必要的库
import cv2  # OpenCV库,用于图像处理
import os  # 操作系统接口,用于文件路径操作
import numpy as np  # 数值计算库,用于处理图像数据


def resize_to_2m_pixels(image):
    h, w = image.shape[:2]

    # 动态选择较小边设为1080
    if h <= w:  # 竖版或正方形:固定高度
        base_dim = 1080
        aspect_ratio = w / h  # 宽度与高度的比例
        new_height = base_dim
        new_width = int(base_dim * aspect_ratio)
    else:  # 横版:固定宽度
        base_dim = 1080
        aspect_ratio = h / w  # 高度与宽度的比例
        new_width = base_dim
        new_height = int(base_dim * aspect_ratio)

    # 动态选择插值算法(缩小时用AREA,放大时用LINEAR)
    interpolation = cv2.INTER_AREA if (new_width < w or new_height < h) else cv2.INTER_LINEAR
    return cv2.resize(image, (new_width, new_height), interpolation=interpolation)


def batch_resize_images(big_image, resize_image):
    """
    批量处理文件夹内所有图片
    :param big_image: 输入图片文件夹路径(字符串)
    :param resize_image: 输出图片文件夹路径(字符串)
    """
    # 创建输出文件夹(exist_ok=True表示如果文件夹已存在不会报错)
    os.makedirs(resize_image, exist_ok=True)

    # 定义支持的图片格式列表(可根据需要扩展)
    supported_formats = ['.jpg', '.jpeg', '.png', '.bmp', '.tiff']

    processed_count = 0  # 成功处理计数器
    failed_count = 0  # 失败处理计数器

    # 遍历输入文件夹内的所有文件
    for filename in os.listdir(big_image):
        # 获取文件扩展名并转换为小写(避免大小写不一致问题)
        ext = os.path.splitext(filename)[1].lower()

        # 跳过不支持的格式
        if ext not in supported_formats:
            continue

        # 构建完整输入/输出路径
        input_path = os.path.join(big_image, filename)
        output_path = os.path.join(resize_image, filename)

        try:
            # 使用支持中文路径的方式读取图片
            # 1. 以二进制方式读取文件
            with open(input_path, 'rb') as f:
                img_data = np.frombuffer(f.read(), dtype=np.uint8)

            # 2. 解码图片数据
            img = cv2.imdecode(img_data, cv2.IMREAD_UNCHANGED)

            # 检查是否成功读取(损坏的文件会返回None)
            if img is None:
                print(f"警告:无法解码 {filename},可能文件损坏")
                failed_count += 1
                continue

            # 调用缩放函数处理图像
            resized_img = resize_to_2m_pixels(img)

            # 使用支持中文路径的方式保存图片
            # 1. 编码图片数据
            success, encoded_img = cv2.imencode(ext, resized_img)

            if not success:
                print(f"警告:无法编码 {filename},保存失败")
                failed_count += 1
                continue

            # 2. 写入文件
            with open(output_path, 'wb') as f:
                f.write(encoded_img.tobytes())

            # 更新计数器并打印进度
            processed_count += 1
            print(f"已处理:{filename} -> {output_path}")

        except Exception as e:  # 捕获所有类型的异常
            print(f"处理 {filename} 时出错:{str(e)}")
            failed_count += 1

    # 最终统计输出
    print(f"\n处理完成!")
    print(f"成功处理: {processed_count} 张图片")
    print(f"处理失败: {failed_count} 张图片")
    print(f"输出目录: {resize_image}")


if __name__ == "__main__":
    # 路径配置(使用原始字符串r""避免转义问题)
    input_dir = r"D:\job\resize_images"  # 原始图片存放位置
    output_dir = r"D:\job\resize_images\resized"  # 处理结果保存位置

    # 执行批量处理函数
    batch_resize_images(big_image=input_dir, resize_image=output_dir)

2. 关键函数分析

(1) resize_to_2m_pixels(image)

功能:动态调整图像尺寸
实现逻辑

def resize_to_2m_pixels(image):
    h, w = image.shape[:2]  # 获取原始尺寸
    
    # 动态选择固定边
    if h <= w:  # 竖版/正方形:固定高度
        base_dim = 1080
        new_height = base_dim
        new_width = int(base_dim * (w / h))
    else:       # 横版:固定宽度
        base_dim = 1080
        new_width = base_dim
        new_height = int(base_dim * (h / w))
    
    # 智能选择插值算法
    interpolation = cv2.INTER_AREA if (new_width < w or new_height < h) else cv2.INTER_LINEAR
    
    return cv2.resize(image, (new_width, new_height), interpolation=interpolation)

特点

  • 自适应横/竖版处理

  • 缩放使用INTER_AREA(缩小更清晰)

  • 放大使用INTER_LINEAR(放大更平滑)

(2) batch_resize_images(big_image, resize_image)

功能:批量处理文件夹内所有图片


关键实现

  • 中文路径支持:通过np.frombuffer + cv2.imdecode处理读取

  • 错误隔离:每个文件独立try-except

  • 格式支持:.jpg.jpeg.png.bmp.tiff

  • 进度反馈:实时打印处理状态

3. 代码优点

  1. 健壮性设计

    • 使用try-except隔离单文件错误

    • 检查img is None处理损坏文件

    • os.makedirs(..., exist_ok=True)防路径错误

  2. 智能处理

    • 自适应横/竖版判断

    • 动态选择插值算法

    • 中文路径支持完善

  3. 用户友好

    • 实时处理进度输出

    • 详细的最终统计报告

    • 清晰的错误提示

  4. 格式兼容性

    • 支持主流图片格式

    • 自动识别扩展名大小写

python

cv2.setLogLevel(3) 是 OpenCV 中用于控制日志输出级别的设置命令

含义解析

  • cv2:OpenCV 库的 Python 接口模块

  • setLogLevel():设置日志级别的函数

  • 3:日志级别的数值,对应 OpenCV 的 WARNING 级别

OpenCV 日志级别对照表

数值 常量名 描述
0 cv2.LOG_LEVEL_VERBOSE 显示所有信息(最详细)
1 cv2.LOG_LEVEL_INFO 显示信息性消息
2 cv2.LOG_LEVEL_DEBUG 显示调试信息
3 cv2.LOG_LEVEL_WARNING 只显示警告信息
4 cv2.LOG_LEVEL_ERROR 只显示错误信息
5 cv2.LOG_LEVEL_SILENT 不显示任何信息(最安静)

具体作用

当你设置 cv2.setLogLevel(3) 时:

  1. 只显示 WARNING 级别及以上的日志(即 WARNING 和 ERROR)

  2. 隐藏 INFO 和 DEBUG 级别的输出

  3. 有效减少控制台输出,避免被大量调试信息干扰

  4. 保持关键错误信息可见,便于问题排查

1. 图像在OpenCV中的表示

  • OpenCV使用numpy数组表示图像

  • 图像数组的维度:

    • 二维数组:灰度图像(高度 × 宽度)

    • 三维数组:彩色图像(高度 × 宽度 × 通道数)

      • 通道顺序:BGR(蓝-绿-红)

2. image.shape 属性

  • 返回描述数组维度的元组(tuple)

  • 格式:(维度1大小, 维度2大小, ...)

  • 示例:

灰度图(800×600) → (600, 800)   # 注意:高度在前!
彩色图(1920×1080) → (1080, 1920, 3)

3. 切片操作 [:2]

  • 提取元组的前两个元素

  • 作用:

    • 灰度图:直接返回 (高度, 宽度)

    • 彩色图:忽略通道维度,返回 (高度, 宽度)

4. 元组解包

  • h, w = ... 将元组解包赋值给变量

  • 结果:

    • h = 图像高度(像素行数)

    • w = 图像宽度(像素列数)

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐