当前位置: 首页 > news >正文

图片修改尺寸

这个脚本具有以下功能:

1、处理指定文件夹中所有的 JPG/JPEG 图片

2、将图片调整为 480×640 像素的尺寸,保持原图比例并在空白处填充白色

3、设置分辨率为 300dpi,确保为 24 位真彩色

4、自动调整 JPEG 压缩质量,使文件大小不超过 40KB

5、将处理后的图片保存到与源文件夹同级的 “23 计 3 改 20250918” 文件夹中

import os
import shutil
from PIL import Image
from io import BytesIO
import tracebackdef resize_images(source_dir):"""调整指定文件夹中所有JPG图片的尺寸和参数,包含详细错误处理"""# 目标文件夹名称target_dir_name = "23计3改20250918"target_dir = os.path.join(os.path.dirname(source_dir), target_dir_name)# 创建目标文件夹if os.path.exists(target_dir):shutil.rmtree(target_dir)os.makedirs(target_dir, exist_ok=True)# 目标参数target_width = 480target_height = 640processed_count = 0skipped_count = 0for filename in os.listdir(source_dir):if filename.lower().endswith(('.jpg', '.jpeg')):try:print(f"开始处理: {filename}")img_path = os.path.join(source_dir, filename)# 步骤1: 尝试打开图片try:with Image.open(img_path) as img:# 转换为RGB模式if img.mode in ('RGBA', 'LA') or (img.mode == 'P' and 'transparency' in img.info):background = Image.new(img.mode[:-1], img.size, (255, 255, 255))background.paste(img, img.split()[-1])img_rgb = background.convert("RGB")elif img.mode != 'RGB':img_rgb = img.convert("RGB")else:img_rgb = img.copy()except Exception as e:raise Exception(f"打开图片失败: {str(e)}")# 步骤2: 调整尺寸try:img_ratio = img_rgb.width / img_rgb.heighttarget_ratio = target_width / target_heightif img_ratio > target_ratio:new_width = target_widthnew_height = int(new_width / img_ratio)else:new_height = target_heightnew_width = int(new_height * img_ratio)resized_img = img_rgb.resize((new_width, new_height), Image.Resampling.LANCZOS)# 创建目标尺寸图像final_img = Image.new('RGB', (target_width, target_height), (255, 255, 255))paste_x = (target_width - new_width) // 2paste_y = (target_height - new_height) // 2final_img.paste(resized_img, (paste_x, paste_y))except Exception as e:raise Exception(f"调整尺寸失败: {str(e)}")# 步骤3: 控制文件大小并保存try:quality = 95target_path = os.path.join(target_dir, filename)buffer = BytesIO()success = Falsewhile quality > 10:buffer.seek(0)buffer.truncate()final_img.save(buffer, 'JPEG', quality=quality, dpi=(300, 300))buffer_size = buffer.tell()  # 使用tell()获取大小,更可靠if buffer_size <= 40 * 1024:# 保存到文件with open(target_path, 'wb') as f:buffer.seek(0)f.write(buffer.read())success = Truebreakquality -= 5if not success:# 即使质量很低也要保存buffer.seek(0)buffer.truncate()final_img.save(buffer, 'JPEG', quality=10, dpi=(300, 300))with open(target_path, 'wb') as f:buffer.seek(0)f.write(buffer.read())success = Trueif success:processed_count += 1print(f"成功处理: {filename}")except Exception as e:raise Exception(f"保存图片失败: {str(e)}")except Exception as e:skipped_count += 1print(f"处理 {filename} 时出错: {str(e)}")# 打印详细的错误堆栈跟踪print("错误详情:")traceback.print_exc()else:skipped_count += 1print(f"跳过非JPG文件: {filename}")print(f"\n处理完成!")print(f"成功处理: {processed_count} 个文件")print(f"跳过: {skipped_count} 个文件")print(f"处理后的文件保存在: {target_dir}")if __name__ == "__main__":source_directory = r"C:\Users\XuZhenZhong\Desktop\23计3学测照片\23计3班学测照片20250917"if not os.path.isdir(source_directory):print(f"错误: {source_directory} 不是有效的文件夹路径")else:resize_images(source_directory)
http://www.dtcms.com/a/389251.html

相关文章:

  • 《嵌入式硬件(十五):基于IMX6ULL的统一异步收发器(UART)的操作》
  • Python爬虫实战:研究Pandas,构建苏宁易购月饼销售数据采集与智能推荐系统
  • 导购app佣金模式的分布式计算架构:实时分账与财务对账
  • Linux Bash脚本自动创建keystore和生成公钥
  • 数据库管理员偏爱哪些MySQL数据库连接工具?
  • 大数据毕业设计选题推荐-基于大数据的农产品交易数据分析与可视化系统-Spark-Hadoop-Bigdata
  • MySQL C API 的“连接孵化器”-`mysql_init()`
  • oracle 数据库导入dmp文件
  • 第二部分:VTK核心类详解(第28章 vtkMatrix4x4矩阵类)
  • JDK、JRE、JVM 是什么?有什么关系?【Java】
  • Visual Studio 2022创建CPP项目
  • Nginx反向代理+负载均衡
  • React Suspense底层原理揭秘
  • 关于pycharm高版本导入torch的问题
  • 【硬件研讨】【笔记本电脑】给老ThinkPad升级内存
  • 论文Review 3DGS SuGaR | CVPR 2024 | 3DGS 转 Mesh 开源方案!!
  • Makefile学习(一)- 基础规则
  • 动态代理 设计模式
  • APP小程序被攻击了该如何应对
  • 零基础从头教学Linux(Day 37)
  • ADB 在嵌入式 Linux 系统调试中的应用
  • 7HTMLCSS高级
  • 玩游戏/用设计软件提示d3dcompiler_47.dll缺失怎么修复?5步快速定位问题,高效修复不踩坑
  • HTML应用指南:利用GET请求获取全国宝马授权经销商门店位置信息
  • 《Java网络编程》第一章:基本网络概念
  • Python内存机制全解析:从基础到高级应用
  • Ubuntu24修改ssh端口
  • hadoop实现一个序列化案例
  • DBG数据库加密网关实现mySQL敏感数据动态脱敏与加密全攻略
  • 解决 Vue SPA 刷新导致 404 的问题