本文目录导读:

使用 Python + Pillow (PIL)
import os
from PIL import Image
import glob
def batch_convert_images(input_dir, output_dir, target_mode='RGB'):
"""
批量转换图片色彩空间
:param input_dir: 输入目录
:param output_dir: 输出目录
:param target_mode: 目标色彩模式 (RGB, CMYK, LAB, HSV, Grayscale 等)
"""
# 创建输出目录
os.makedirs(output_dir, exist_ok=True)
# 支持的图片格式
image_extensions = ['*.jpg', '*.jpeg', '*.png', '*.bmp', '*.tiff']
for ext in image_extensions:
for img_path in glob.glob(os.path.join(input_dir, ext)):
try:
# 打开图片
img = Image.open(img_path)
# 转换色彩空间
if target_mode == 'CMYK':
converted_img = img.convert('CMYK')
elif target_mode == 'Lab':
converted_img = img.convert('LAB')
elif target_mode == 'HSV':
converted_img = img.convert('HSV')
elif target_mode == 'Grayscale':
converted_img = img.convert('L') # L 表示灰度
else: # 默认 RGB
converted_img = img.convert('RGB')
# 保存图片
filename = os.path.basename(img_path)
output_path = os.path.join(output_dir, filename)
converted_img.save(output_path)
print(f"转换完成: {filename} -> {target_mode}")
except Exception as e:
print(f"转换失败 {img_path}: {str(e)}")
# 使用示例
if __name__ == "__main__":
# 批量转换图片为 CMYK
batch_convert_images(
input_dir="./input_images",
output_dir="./output_cmyk",
target_mode='CMYK'
)
使用 ImageMagick (命令行)
#!/bin/bash
# 批量转换所有 JPG 图片为 CMYK
for file in ./input/*.{jpg,jpeg,png}; do
if [ -f "$file" ]; then
filename=$(basename "$file")
convert "$file" -colorspace CMYK "./output/cmyk_${filename%.*}.jpg"
echo "转换完成: $filename"
fi
done
Python + OpenCV
import cv2
import os
import glob
import numpy as np
def batch_color_space_conversion(input_dir, output_dir, conversion_type='RGB_TO_HSV'):
"""
使用 OpenCV 批量转换色彩空间
:param conversion_type: 'RGB_TO_HSV', 'RGB_TO_LAB', 'RGB_TO_YCrCb' 等
"""
os.makedirs(output_dir, exist_ok=True)
# 转换类型映射
conversions = {
'RGB_TO_HSV': cv2.COLOR_RGB2HSV,
'RGB_TO_LAB': cv2.COLOR_RGB2LAB,
'RGB_TO_YCrCb': cv2.COLOR_RGB2YCrCb,
'RGB_TO_HLS': cv2.COLOR_RGB2HLS,
'BGR_TO_RGB': cv2.COLOR_BGR2RGB,
'BGR_TO_GRAY': cv2.COLOR_BGR2GRAY
}
conversion_code = conversions.get(conversion_type, cv2.COLOR_RGB2HSV)
for img_path in glob.glob(os.path.join(input_dir, "*.*")):
try:
# 读取图片 (OpenCV 默认 BGR)
img = cv2.imread(img_path)
if img is None:
continue
# 转换色彩空间
converted = cv2.cvtColor(img, conversion_code)
# 保存图片
filename = os.path.basename(img_path)
output_path = os.path.join(output_dir, f"converted_{filename}")
cv2.imwrite(output_path, converted)
print(f"转换完成: {filename}")
except Exception as e:
print(f"转换失败 {img_path}: {str(e)}")
# 使用示例
batch_color_space_conversion(
input_dir="./input",
output_dir="./output",
conversion_type='RGB_TO_HSV'
)
批量转换脚本 (通用版)
#!/usr/bin/env python3
"""
通用色彩空间批量转换工具
"""
import argparse
import os
from PIL import Image
import glob
from concurrent.futures import ThreadPoolExecutor
import tqdm
def convert_single_image(args):
"""单个图片转换函数"""
img_path, output_dir, target_mode = args
try:
img = Image.open(img_path)
filename = os.path.basename(img_path)
# 转换色彩空间
converted_img = convert_color_mode(img, target_mode)
# 保存
output_path = os.path.join(output_dir, f"converted_{filename}")
converted_img.save(output_path)
return (filename, True, None)
except Exception as e:
return (img_path, False, str(e))
def convert_color_mode(img, mode):
"""转换色彩模式"""
modes = {
'RGB': 'RGB',
'RGBA': 'RGBA',
'CMYK': 'CMYK',
'GRAY': 'L', # 灰度
'HSV': 'HSV',
'LAB': 'LAB'
}
target_mode = modes.get(mode.upper(), 'RGB')
return img.convert(target_mode)
def main():
parser = argparse.ArgumentParser(description='批量图片色彩空间转换工具')
parser.add_argument('input_dir', help='输入目录')
parser.add_argument('output_dir', help='输出目录')
parser.add_argument('--mode', default='RGB',
choices=['RGB', 'CMYK', 'GRAY', 'HSV', 'LAB'],
help='目标色彩模式')
parser.add_argument('--threads', type=int, default=4, help='线程数')
parser.add_argument('--extensions', nargs='+', default=['*.jpg', '*.png'],
help='文件扩展名')
args = parser.parse_args()
# 创建输出目录
os.makedirs(args.output_dir, exist_ok=True)
# 收集所有图片路径
image_paths = []
for ext in args.extensions:
image_paths.extend(glob.glob(os.path.join(args.input_dir, ext)))
print(f"找到 {len(image_paths)} 个图片文件")
# 准备参数
convert_args = [(path, args.output_dir, args.mode) for path in image_paths]
# 多线程转换
with ThreadPoolExecutor(max_workers=args.threads) as executor:
results = list(tqdm.tqdm(
executor.map(convert_single_image, convert_args),
total=len(convert_args),
desc="转换进度"
))
# 统计结果
success = [r for r in results if r[1]]
failed = [r for r in results if not r[1]]
print(f"\n转换完成:")
print(f"成功: {len(success)} 个")
print(f"失败: {len(failed)} 个")
if failed:
print("\n失败的图片:")
for f in failed:
print(f" - {f[0]}: {f[2]}")
if __name__ == "__main__":
main()
使用方法
安装依赖:
pip install Pillow opencv-python tqdm
命令行使用:
# 基本用法 python batch_convert.py ./input ./output --mode CMYK # 指定文件类型 python batch_convert.py ./input ./output --mode GRAY --extensions *.jpg *.png # 多线程处理 python batch_convert.py ./input ./output --mode HSV --threads 8
常见色彩模式说明
- RGB: 红绿蓝(屏幕显示)
- CMYK: 青品黄黑(打印输出)
- GRAY: 灰度图
- HSV: 色相饱和度明度
- LAB: 亮度A通道B通道(人眼感知)
这些脚本可以根据您的具体需求进行调整,包括文件类型、色彩模式、输出路径等。