【Python】一个简单的小程序,实现批量修改图片格式(附完整代码及程序)

本文介绍了一个Python程序,用于批量转换图片格式。程序提供图形界面,用户可以选择要转换的格式,支持jpg、png和gif。转换过程包括:创建文件夹、清空目标文件夹、读取源文件夹图片并按指定格式保存。注意源文件夹应只包含待转换的图片,转换后可能覆盖同名文件。

程序下载地址:链接:https://pan.baidu.com/s/1ser7iEMRS54syvwl1cck1Q?pwd=jr66 
提取码:jr66

一、完整代码

如果想要测试代码,记得在使用前先保证已经安装了Python的PIL模块

import os
from tkinter import Tk, Button, messagebox
from PIL import Image

# 检查并创建文件夹
def check_and_create_folders():
    if not os.path.exists('Old_Img'):
        os.makedirs('Old_Img')
    if not os.path.exists('New_Img'):
        os.makedirs('New_Img')

# 清空New_Img文件夹
def clear_new_img_folder():
    file_list = os.listdir('New_Img')
    for file_name in file_list:
        file_path = os.path.join('New_Img', file_name)
        if os.path.isfile(file_path):
            os.remove(file_path)

# 图片格式转换函数
def convert_images(image_format):
    old_img_folder = 'Old_Img'
    new_img_folder = 'New_Img'

    # 获取Old_Img文件夹中的图片文件列表
    file_list = os.listdir(old_img_folder)

    for file_name in file_list:
        file_path = os.path.join(old_img_folder, file_name)
        if os.path.isfil
<think>好的,我现在需要帮助用户解决用Python批量修改图片大小和剪裁的问题。用户提到了PIL和OpenCV,所以我要确保涵盖这两个库的示例。 首先,我应该回顾用户提供的引用内容。引用1和3提到OpenCV的resize函数,引用2和4涉及PIL库。用户的需求是批量处理,所以代码需要遍历文件夹中的图片,进行尺寸调整和裁剪。 接下来,我需要确定两种方法的实现步骤。对于PIL,步骤包括:读取图片、调整大小、裁剪、保存。OpenCV的步骤类似,但注意颜色通道可能不同(BGR vs RGB),需要转换吗?引用3中的示例直接使用imread,可能需要处理颜色问题。 裁剪部分,用户可能需要中心裁剪,或者其他方式?比如固定坐标或自动检测。用户没有具体说明,所以先采用中心裁剪作为示例,并说明可调整参数。 批量处理方面,需要遍历指定目录的所有图片文件,可能需要过滤文件类型,如.jpg、.png等。在代码中加入文件格式的判断,避免处理非图片文件。 关于性能,OpenCV通常处理速度快,适合大量图片;而PIL更易用。用户可能需要比较两者,但根据引用4,用户可能已经了解这点,所以提供两种示例即可。 然后,代码结构方面,每个函数处理一张图片,再循环调用。同时,处理后的保存路径要合理,比如创建output文件夹,避免覆盖原文件。 还需要注意异常处理,比如文件无法读取时跳过,或者权限问题。但用户示例中可能不需要复杂错误处理,保持代码简洁。 最后,生成相关问题,可能涉及性能优化、其他处理功能、格式转换等,参考用户之前的兴趣点,如引用中的直方图、轮廓图,可以提出相关问题。</think>以下是使用Python进行批量图片尺寸修改和裁剪的两种实现方案(分别基于PIL和OpenCV),包含完整代码示例和操作说明: ### 一、PIL库实现方案 ```python from PIL import Image import os def process_image_pil(input_path, output_dir, target_size=(800,600), crop_area=(100,100,700,500)): """ 批量处理图片:调整尺寸+裁剪 :param input_path: 输入图片路径/文件夹路径 :param output_dir: 输出目录 :param target_size: 目标尺寸(宽,高) :param crop_area: 裁剪区域(左,上,右,下) """ if not os.path.exists(output_dir): os.makedirs(output_dir) # 遍历所有图片文件 for filename in os.listdir(input_path): if filename.lower().endswith(('.png', '.jpg', '.jpeg')): file_path = os.path.join(input_path, filename) with Image.open(file_path) as img: # 调整尺寸 resized = img.resize(target_size) # 裁剪图像 cropped = resized.crop(crop_area) # 保存结果 output_path = os.path.join(output_dir, f"processed_{filename}") cropped.save(output_path) # 使用示例 process_image_pil("input_images", "output", target_size=(1024,768), crop_area=(200,150,824,618)) ``` ### 二、OpenCV实现方案 ```python import cv2 import os def process_image_opencv(input_path, output_dir, target_size=(800,600), crop_area=(100,100,700,500)): """ 批量处理图片:调整尺寸+裁剪 :param crop_area: 裁剪区域(x,y,w,h) """ if not os.path.exists(output_dir): os.makedirs(output_dir) for filename in os.listdir(input_path): if filename.lower().endswith(('.png', '.jpg', '.jpeg')): file_path = os.path.join(input_path, filename) # 读取图像(包含alpha通道) img = cv2.imread(file_path, cv2.IMREAD_UNCHANGED) # 调整尺寸 resized = cv2.resize(img, target_size) # 裁剪图像(注意OpenCV的坐标顺序) x,y,w,h = crop_area cropped = resized[y:y+h, x:x+w] # 保存结果 output_path = os.path.join(output_dir, f"cv_processed_{filename}") cv2.imwrite(output_path, cropped) # 使用示例 process_image_opencv("input_images", "output_cv", target_size=(1024,768), crop_area=(200,150,624,468)) # 624=824-200, 468=618-150 ``` ### 三、方案对比说明 | 特性 | PIL方案 | OpenCV方案 | |--------------------|--------------------------------|-------------------------------| | 颜色通道 | RGB格式 | BGR格式[^3] | | 处理速度 | 适中 | 较快 | | 功能扩展 | 适合基础处理 | 适合计算机视觉处理[^1] | | 透明通道支持 | 自动保留alpha通道 | 需指定IMREAD_UNCHANGED[^3] | | 图像质量 | 提供多种重采样算法 | 线性插值为主 | ### 四、高级技巧 1. **智能裁剪**:使用人脸检测自动确定裁剪区域 ```python # 需安装opencv-contrib-python face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, 1.1, 4) ``` 2. **保持比例调整尺寸**: ```python def resize_keep_ratio(img, max_size): width, height = img.size ratio = min(max_size/width, max_size/height) return img.resize((int(width*ratio), int(height*ratio))) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啊啊啊啊啊威

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值