批量处理指定文件夹中的图片文件,将每张图片调整为短边1080像素(保持长宽比)
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. 代码优点
-
健壮性设计
-
使用
try-except隔离单文件错误 -
检查
img is None处理损坏文件 -
os.makedirs(..., exist_ok=True)防路径错误
-
-
智能处理
-
自适应横/竖版判断
-
动态选择插值算法
-
中文路径支持完善
-
-
用户友好
-
实时处理进度输出
-
详细的最终统计报告
-
清晰的错误提示
-
-
格式兼容性
-
支持主流图片格式
-
自动识别扩展名大小写
-
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) 时:
-
只显示 WARNING 级别及以上的日志(即 WARNING 和 ERROR)
-
隐藏 INFO 和 DEBUG 级别的输出
-
有效减少控制台输出,避免被大量调试信息干扰
-
保持关键错误信息可见,便于问题排查
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= 图像宽度(像素列数)
-
更多推荐


所有评论(0)