You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python旋转图片:如何自动匹配图片背景色实现批量处理

自动用图片自身颜色填充旋转背景的实现方案

刚好之前做批量图片处理的时候碰到过一模一样的需求!默认的黑色填充确实很违和,要自动用图片自身的颜色填充背景,其实可以通过提取图片边缘的主色调来实现,完全不用手动设置固定颜色,而且批量处理也很方便。

核心思路

旋转后露出的空白区域,本质上是图片原本边缘的延伸,所以我们可以:

  • 提取图片边缘区域的颜色(平均色或主色调)
  • 旋转图片时,用这个提取到的颜色作为填充色
  • 封装成函数,遍历文件夹实现批量处理

具体代码实现

1. 提取图片背景色(平均边缘色版本)

这个方法适合背景色相对单一的图片,取四周边缘像素的平均RGB值作为填充色:

from PIL import Image
import numpy as np

def get_background_color(img, edge_width=10):
    """从图片边缘提取平均背景色"""
    width, height = img.size
    # 截取图片四周的边缘区域
    edge_regions = [
        # 顶部边缘
        img.crop((0, 0, width, edge_width)),
        # 底部边缘
        img.crop((0, height - edge_width, width, height)),
        # 左侧边缘(排除上下已截取的部分)
        img.crop((0, edge_width, edge_width, height - edge_width)),
        # 右侧边缘(排除上下已截取的部分)
        img.crop((width - edge_width, edge_width, width, height - edge_width))
    ]
    
    # 收集所有边缘像素
    all_pixels = []
    for region in edge_regions:
        pixel_array = np.array(region)
        all_pixels.extend(pixel_array.reshape(-1, 3))
    
    # 计算平均RGB值并转换为整数元组
    avg_rgb = np.mean(all_pixels, axis=0).astype(int)
    return tuple(avg_rgb)

2. 旋转并自动填充背景的函数

结合上面的颜色提取函数,实现旋转逻辑,注意要开启expand=True保证完整显示旋转后的图片:

def rotate_with_auto_bg(input_img_path, output_img_path, angle=10):
    """旋转图片并自动用图片自身颜色填充背景"""
    with Image.open(input_img_path) as img:
        bg_color = get_background_color(img)
        # rotate方法的fill参数设置填充色,expand=True确保生成完整的旋转图
        rotated_img = img.rotate(angle, expand=True, fill=bg_color)
        rotated_img.save(output_img_path)

3. 批量处理脚本

遍历指定文件夹下的所有JPG图片,批量完成旋转和填充:

import os

# 配置输入输出文件夹
INPUT_DIR = "your_input_images_folder"
OUTPUT_DIR = "your_rotated_images_folder"

# 创建输出文件夹(如果不存在)
os.makedirs(OUTPUT_DIR, exist_ok=True)

# 遍历处理所有JPG图片
for filename in os.listdir(INPUT_DIR):
    if filename.lower().endswith(".jpg"):
        input_path = os.path.join(INPUT_DIR, filename)
        # 生成输出文件名(原文件名+'-rotated')
        output_filename = f"{os.path.splitext(filename)[0]}-rotated.jpg"
        output_path = os.path.join(OUTPUT_DIR, output_filename)
        # 执行旋转
        rotate_with_auto_bg(input_path, output_path, angle=10)

进阶优化:用聚类提取主色调(适合渐变背景)

如果你的图片背景是渐变或者有多种相近颜色,可以用K-means聚类找出边缘区域的主色调,替换上面的get_background_color函数:

from sklearn.cluster import KMeans

def get_background_color(img, edge_width=10):
    """用K-means聚类提取边缘主色调"""
    width, height = img.size
    edge_regions = [
        img.crop((0, 0, width, edge_width)),
        img.crop((0, height - edge_width, width, height)),
        img.crop((0, edge_width, edge_width, height - edge_width)),
        img.crop((width - edge_width, edge_width, width, height - edge_width))
    ]
    
    all_pixels = []
    for region in edge_regions:
        pixel_array = np.array(region)
        all_pixels.extend(pixel_array.reshape(-1, 3))
    
    # 聚类找最主要的1种颜色(可以调整n_clusters找更多主色)
    kmeans = KMeans(n_clusters=1, random_state=42)
    kmeans.fit(all_pixels)
    main_color = kmeans.cluster_centers_[0].astype(int)
    return tuple(main_color)

注意事项

  • 如果用聚类版本,需要安装依赖:pip install numpy scikit-learn
  • 边缘宽度edge_width可以根据图片大小调整,大图片设20,小图片设5即可
  • 如果处理PNG透明图,需要修改代码支持RGBA通道(把reshape(-1,3)改成reshape(-1,4),计算颜色时包含alpha值)

内容的提问来源于stack exchange,提问作者Peter

火山引擎 最新活动