当前位置: 首页 > 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.jsqmd.com/news/87151/

相关文章:

  • 基于C++的爬虫框架 - 实践
  • 7个重塑知识生产力的Obsidian Zettelkasten模板设计策略
  • 2025年知名的机制净化板/净化板厂家最新TOP实力排行 - 品牌宣传支持者
  • Nord调色板国际化色彩应用:构建全球统一视觉体验的专业指南
  • 数据分析师的基本功总结
  • AutoGPT事件驱动设计:通过消息队列实现松耦合
  • Unity教学 项目2 2D闯关游戏
  • 2025轻量AI革命:Granite-4.0-H-Micro-Base如何重塑企业智能落地范式
  • 《大明王朝 1566》电子版书籍 + 46 集影视高清资源,速存防失效
  • 爆炸事件检测与识别 _ 基于YOLOv5-AFPN-P2345模型的改进实现
  • Refine+Next.js+Ant Design实战避坑指南:从版本冲突到性能优化的完整解决方案
  • 通信基站抛物面天线检测--基于RPN与FPN的改进算法实现
  • 2025年热门的光照振荡培养箱/水浴恒温振荡培养箱厂家推荐及选购参考榜 - 品牌宣传支持者
  • CosyVoice ONNX模型部署终极指南:5大实战技巧快速掌握
  • FastAPI性能优化技巧
  • Seal视频下载器智能文件名生成功能详解
  • 2.1 Cursor核心功能全解析:文档集成与行为定制化
  • Unity教学 项目1 2D赛车小游戏
  • 实用指南:HarmonyOS RelativeContainer相对布局:超越线性思维的约束艺术
  • 效率革命:Qwen-Image-Edit-Rapid-AIO V10重新定义AI图像编辑
  • KAREL编程实战手册:FANUC机器人数据交互核心技术解析
  • 2025年口碑好的拉扭复合试验机TOP品牌厂家排行榜 - 品牌宣传支持者
  • 严正声明
  • React Native Share:移动端跨平台分享解决方案
  • 从零构建企业专属Android应用商店:私有化部署完整方案
  • VonaJS: I18n如何支持Swagger多语言
  • SketchUp 8.0完全自学终极指南
  • 华为开源盘古Pro MoE:720亿参数大模型如何重构AI效率边界
  • C语言:数据库内核开发的隐形冠军
  • 再谈需求无止境,EAST和金融机构--SMP(软件制作平台)