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

【Python】批量转换文件夹内的图片为ICO

import os
from PIL import Image
import sysdef convert_folder_to_ico(input_folder, output_folder=None, sizes=None):"""批量转换文件夹内的图片为ICOArgs:input_folder: 输入文件夹路径output_folder: 输出文件夹路径(默认为输入文件夹内的ico_output)sizes: ICO尺寸列表,默认为[16, 32, 48, 64, 128, 256]"""# 支持的图片格式supported_formats = ('.png', '.jpg', '.jpeg', '.bmp', '.gif', '.tiff', '.webp')# 设置默认尺寸if sizes is None:sizes = [16, 32, 48, 64, 128, 256]# 设置输出文件夹if output_folder is None:output_folder = os.path.join(input_folder, 'ico_output')# 创建输出文件夹os.makedirs(output_folder, exist_ok=True)# 统计变量success_count = 0error_count = 0# 遍历文件夹for filename in os.listdir(input_folder):# 检查是否为支持的图片格式if filename.lower().endswith(supported_formats):input_path = os.path.join(input_folder, filename)try:# 打开图片img = Image.open(input_path)# 准备不同尺寸的图片icon_sizes = []for size in sizes:# 兼容不同Pillow版本的重采样方法try:# 新版本写法resized_img = img.resize((size, size), Image.Resampling.LANCZOS)except AttributeError:try:# 较新版本写法resized_img = img.resize((size, size), Image.LANCZOS)except:# 旧版本写法resized_img = img.resize((size, size), Image.ANTIALIAS)icon_sizes.append(resized_img)# 生成输出文件名base_name = os.path.splitext(filename)[0]output_path = os.path.join(output_folder, f"{base_name}.ico")# 保存为ICO(兼容不同版本的保存方式)try:# 新版本保存方式icon_sizes[0].save(output_path,format='ICO',sizes=[(size, size) for size in sizes],append_images=icon_sizes[1:] if len(icon_sizes) > 1 else None)except:# 旧版本保存方式# 如果保存失败,尝试只保存256x256尺寸img_resized = img.resize((256, 256), Image.Resampling.LANCZOS if hasattr(Image,'Resampling') else Image.LANCZOS)img_resized.save(output_path, format='ICO')print(f"✓ 转换成功: {filename} -> {base_name}.ico")success_count += 1except Exception as e:print(f"✗ 转换失败: {filename} - 错误: {str(e)}")error_count += 1import tracebacktraceback.print_exc()  # 打印详细错误信息print(f"\n转换完成!成功: {success_count}个,失败: {error_count}个")print(f"输出文件夹: {output_folder}")# 简化版本,兼容性更好
def convert_folder_to_ico_simple(input_folder, output_folder=None):"""简化版批量转换,兼容性更好"""# 支持的图片格式supported_formats = ('.png', '.jpg', '.jpeg')# 设置输出文件夹if output_folder is None:output_folder = os.path.join(input_folder, 'ico_output')# 创建输出文件夹os.makedirs(output_folder, exist_ok=True)# 统计变量success_count = 0error_count = 0# 遍历文件夹for filename in os.listdir(input_folder):# 检查是否为支持的图片格式if filename.lower().endswith(supported_formats):input_path = os.path.join(input_folder, filename)try:# 打开图片img = Image.open(input_path)# 生成输出文件名base_name = os.path.splitext(filename)[0]output_path = os.path.join(output_folder, f"{base_name}.ico")# 简化:只保存256x256尺寸# 确定重采样方法if hasattr(Image, 'Resampling'):resample_method = Image.Resampling.LANCZOSelif hasattr(Image, 'LANCZOS'):resample_method = Image.LANCZOSelse:resample_method = Image.ANTIALIAS# 调整大小img_resized = img.resize((256, 256), resample_method)# 保存为ICOimg_resized.save(output_path, format='ICO')print(f"✓ 转换成功: {filename} -> {base_name}.ico")success_count += 1except Exception as e:print(f"✗ 转换失败: {filename} - 错误: {str(e)}")error_count += 1print(f"\n转换完成!成功: {success_count}个,失败: {error_count}个")print(f"输出文件夹: {output_folder}")# 增强版:支持多尺寸和格式转换
def convert_folder_to_ico_enhanced(input_folder, output_folder=None, sizes=None):"""增强版批量转换"""# 支持的图片格式supported_formats = ('.png', '.jpg', '.jpeg', '.bmp', '.gif', '.tiff', '.webp')# 设置默认尺寸if sizes is None:sizes = [16, 32, 48, 64, 128, 256]# 设置输出文件夹if output_folder is None:output_folder = os.path.join(input_folder, 'ico_output')# 创建输出文件夹os.makedirs(output_folder, exist_ok=True)# 获取重采样方法def get_resample_method():if hasattr(Image, 'Resampling'):return Image.Resampling.LANCZOSelif hasattr(Image, 'LANCZOS'):return Image.LANCZOSelse:return Image.ANTIALIASresample_method = get_resample_method()# 统计变量success_count = 0error_count = 0# 遍历文件夹for filename in os.listdir(input_folder):# 检查是否为支持的图片格式if filename.lower().endswith(supported_formats):input_path = os.path.join(input_folder, filename)try:# 打开图片with Image.open(input_path) as img:# 如果图片有透明通道,转换为RGBAif img.mode in ('P', 'RGBA'):img = img.convert('RGBA')else:img = img.convert('RGB')# 生成输出文件名base_name = os.path.splitext(filename)[0]output_path = os.path.join(output_folder, f"{base_name}.ico")# 创建不同尺寸的图像images = []for size in sizes:resized = img.resize((size, size), resample_method)images.append(resized)# 保存为ICO# 使用第一个图像作为主图像,附加其他尺寸if len(images) > 0:images[0].save(output_path,format='ICO',append_images=images[1:] if len(images) > 1 else [])print(f"✓ 转换成功: {filename} -> {base_name}.ico")success_count += 1except Exception as e:print(f"✗ 转换失败: {filename} - 错误: {str(e)}")error_count += 1print(f"\n转换完成!成功: {success_count}个,失败: {error_count}个")print(f"输出文件夹: {output_folder}")if __name__ == "__main__":print("批量图片转ICO工具")print("=" * 40)# 获取输入路径if len(sys.argv) > 1:input_path = sys.argv[1]else:input_path = input("请输入图片文件夹路径: ").strip('"').strip("'")if not os.path.exists(input_path):print("错误:文件夹不存在!")sys.exit(1)print("\n选择转换模式:")print("1. 简单模式(快速,单尺寸)")print("2. 标准模式(推荐,多尺寸)")print("3. 增强模式(完整功能)")mode = input("\n请选择模式 (1/2/3, 默认2): ").strip()if mode == "1":convert_folder_to_ico_simple(input_path)elif mode == "3":# 自定义尺寸custom_sizes = input("请输入ICO尺寸(用逗号分隔,如: 16,32,48,64,128,256): ")if custom_sizes:sizes = [int(s.strip()) for s in custom_sizes.split(',')]else:sizes = None# 自定义输出文件夹output_path = input("请输入输出文件夹路径(直接回车使用默认): ").strip('"').strip("'")output_path = output_path if output_path else Noneconvert_folder_to_ico_enhanced(input_path, output_path, sizes)else:convert_folder_to_ico(input_path)

运行结果
image

http://www.rkmt.cn/news/97408.html

相关文章:

  • 数据分析师的基本功总结
  • Nord调色板国际化色彩应用:构建全球统一视觉体验的专业指南
  • Unity教学 项目2 2D闯关游戏
  • 爆炸事件检测与识别 _ 基于YOLOv5-AFPN-P2345模型的改进实现
  • Refine+Next.js+Ant Design实战避坑指南:从版本冲突到性能优化的完整解决方案
  • CosyVoice ONNX模型部署终极指南:5大实战技巧快速掌握
  • 实用指南:HarmonyOS RelativeContainer相对布局:超越线性思维的约束艺术
  • Unity教学 项目1 2D赛车小游戏
  • KAREL编程实战手册:FANUC机器人数据交互核心技术解析
  • React Native Share:移动端跨平台分享解决方案
  • 严正声明
  • 从零构建企业专属Android应用商店:私有化部署完整方案
  • 华为开源盘古Pro MoE:720亿参数大模型如何重构AI效率边界
  • 再谈需求无止境,EAST和金融机构--SMP(软件制作平台)
  • iOS UI框架革命:DCFrame如何用数据驱动让开发效率提升300%
  • Zephyr编译优化终极指南:5个技巧提升嵌入式系统性能
  • TWiLight Menu++ 新手完全指南:从零开始掌握复古游戏启动器
  • 阿里巴巴千问APP上线:开源大模型在消费级AI中的应用实践 - 教程
  • 2025年靠谱的辊筒输送机/提升机输送机最新TOP厂家排名 - 品牌宣传支持者
  • debug.js实战指南:从安装到高级用法的完整教程
  • 70、Ubuntu 和 Linux 网络资源全解析
  • 2025年比较好的定制家具五金/品牌家具五金厂家推荐及采购指南 - 品牌宣传支持者
  • 2025年口碑好的浙江立体停车库链条/浙江摩托车链条高评价厂家推荐榜 - 品牌宣传支持者
  • Vue 3 + Vite
  • 2025年评价高的冷弯半圆管/后壁半圆管厂家最新推荐排行榜 - 行业平台推荐
  • CubeFS贡献者成长路线:从入门到专家的实战指南
  • 2025年比较好的手办亚克力展示架厂家最新TOP实力排行 - 品牌宣传支持者
  • 2025年质量好的自动化零件机械加工/五轴机械加工厂家最新推荐排行榜 - 行业平台推荐
  • 小区物业|基于springboot + vue小区居民物业管理系统(源码+数据库+文档)
  • 2025年拎拎壶学生保温杯行业内口碑厂家排行榜 - 行业平台推荐