图片格式转换工具

[复制链接]
83 |10
发表于 昨天 22:53 | 显示全部楼层 |阅读模式
最近学习python想用自己喜欢的图片做图标还得去网站上转换,突发奇想不如自己做一个转换工具,
该工具支持6种主流图片格式进行互转,转为ICO格式时需要强制选择分辨率。

附上源码和软件,希望大家喜欢。
https://thebzk.lanzn.com/inuVD2pucl9a
密码:en0p



[Python]  
  1. import tkinter as tk
  2. import ttkbootstrap as ttk
  3. from ttkbootstrap.constants import *
  4. from tkinter import filedialog, messagebox
  5. from PIL import Image, ImageTk, UnidentifiedImageError
  6. formats = {
  7.     "ICO": ".ico",
  8.     "PNG": ".png",
  9.     "JPEG": ".jpg",
  10.     "GIF": ".gif",
  11.     "BMP": ".bmp",
  12.     "TIFF": ".tiff"
  13. }
  14. ico_resolutions = {
  15.     "16x16": (16, 16),
  16.     "24x24": (24, 24),
  17.     "32x32": (32, 32),
  18.     "48x48": (48, 48),
  19.     "64x64": (64, 64),
  20.     "128x128": (128, 128),
  21.     "256x256": (256, 256)
  22. }
  23. class ImageConverterGUI:
  24.     def __init__(self, master):
  25.         self.master = master
  26.         self.master.title("图片格式转换工具 v1.0 — Thebzk")
  27.         self.master.geometry("600x700")
  28.         self.master.resizable(False, False)
  29.         main_frame = ttk.Frame(self.master, padding=20)
  30.         main_frame.pack(fill=tk.BOTH, expand=True)
  31.         input_frame = ttk.Labelframe(main_frame, text="输入文件", padding=10)
  32.         input_frame.pack(fill=tk.X, pady=5)
  33.         input_grid = ttk.Frame(input_frame)
  34.         input_grid.pack(fill=tk.X)
  35.         ttk.Label(input_grid, text="选择图片文件:").grid(row=0, column=0, padx=5)
  36.         self.input_var = tk.StringVar()
  37.         ttk.Entry(input_grid, textvariable=self.input_var, width=40).grid(row=0, column=1, padx=5)
  38.         ttk.Button(
  39.             input_grid,
  40.             text="选择文件",
  41.             command=self.choose_input_file,
  42.             bootstyle="primary",
  43.             width=12
  44.         ).grid(row=0, column=2, padx=5)
  45.         settings_frame = ttk.Labelframe(main_frame, text="转换设置", padding=10)
  46.         settings_frame.pack(fill=tk.X, pady=5)
  47.         settings_grid = ttk.Frame(settings_frame)
  48.         settings_grid.pack(fill=tk.X)
  49.         ttk.Label(settings_grid, text="输出格式:").grid(row=0, column=0, padx=5)
  50.         self.format_var = tk.StringVar(value='')
  51.         format_combobox = ttk.Combobox(
  52.             settings_grid,
  53.             textvariable=self.format_var,
  54.             values=list(formats.keys()),
  55.             bootstyle="primary",
  56.             state="readonly",
  57.             width=12
  58.         )
  59.         format_combobox.grid(row=0, column=1, padx=5)
  60.         self.ico_resolution_var = tk.StringVar(value='')
  61.         self.ico_resolution_box = ttk.Combobox(
  62.             settings_grid,
  63.             textvariable=self.ico_resolution_var,
  64.             values=list(ico_resolutions.keys()),
  65.             bootstyle="primary",
  66.             state="disabled",
  67.             width=12
  68.         )
  69.         self.ico_resolution_box.grid(row=0, column=2, padx=5)
  70.         format_combobox.bind("", self.toggle_ico_resolution)
  71.         ttk.Button(
  72.             settings_grid,
  73.             text="开始转换",
  74.             command=self.convert,
  75.             bootstyle="success",
  76.             width=12
  77.         ).grid(row=0, column=3, padx=5)
  78.         preview_frame = ttk.Labelframe(main_frame, text="图片预览", padding=10)
  79.         preview_frame.pack(fill=tk.BOTH, expand=True, pady=5)
  80.         self.preview_canvas = ttk.Canvas(preview_frame, bg='#f8f9fa')
  81.         self.preview_canvas.pack(fill=tk.BOTH, expand=True)
  82.         self.preview_image = None
  83.         log_frame = ttk.Labelframe(main_frame, text="操作日志", padding=10)
  84.         log_frame.pack(fill=tk.X, pady=5)
  85.         self.log_area = ttk.Text(
  86.             log_frame,
  87.             wrap=tk.WORD,
  88.             font=("Consolas", 9),
  89.             height=22,
  90.             bg="#f8f9fa",
  91.             fg="#495057"
  92.         )
  93.         self.log_area.pack(fill=tk.BOTH)
  94.     def toggle_ico_resolution(self, event):
  95.         """切换ICO分辨率下拉框状态"""
  96.         if self.format_var.get() == "ICO":
  97.             self.ico_resolution_box.configure(state="readonly")
  98.         else:
  99.             self.ico_resolution_box.configure(state="disabled")
  100.     def choose_input_file(self):
  101.         file_path = filedialog.askopenfilename(
  102.             filetypes=[("图片文件", "*.png;*.jpg;*.jpeg;*.gif;*.bmp;*.tiff")]
  103.         )
  104.         if file_path:
  105.             self.input_var.set(file_path)
  106.             self.show_preview(file_path)
  107.     def show_preview(self, file_path):
  108.         try:
  109.             self.preview_canvas.delete("all")
  110.             img = Image.open(file_path)
  111.             canvas_width = self.preview_canvas.winfo_width() - 20
  112.             canvas_height = self.preview_canvas.winfo_height() - 20
  113.             img_ratio = img.width / img.height
  114.             canvas_ratio = canvas_width / canvas_height
  115.             if img_ratio > canvas_ratio:
  116.                 new_width = min(img.width, canvas_width)
  117.                 new_height = int(new_width / img_ratio)
  118.             else:
  119.                 new_height = min(img.height, canvas_height)
  120.                 new_width = int(new_height * img_ratio)
  121.             img = img.resize((new_width, new_height), Image.LANCZOS)
  122.             self.preview_image = ImageTk.PhotoImage(img)
  123.             x = (self.preview_canvas.winfo_width() - new_width) // 2
  124.             y = (self.preview_canvas.winfo_height() - new_height) // 2
  125.             self.preview_canvas.create_image(x, y, anchor=tk.NW, image=self.preview_image)
  126.         except Exception as e:
  127.             messagebox.showerror("错误", f"预览失败: {str(e)}")
  128.     def convert(self):
  129.         input_path = self.input_var.get()
  130.         output_format = self.format_var.get()
  131.         ico_resolution = self.ico_resolution_var.get()
  132.         if not input_path:
  133.             messagebox.showwarning("提示", "请选择输入文件!")
  134.             return
  135.         if not output_format:
  136.             messagebox.showwarning("提示", "请选择输出格式!")
  137.             return
  138.         output_dir = filedialog.askdirectory(title="选择输出目录")
  139.         if not output_dir:
  140.             messagebox.showwarning("提示", "请选择输出目录!")
  141.             return
  142.         try:
  143.             img = Image.open(input_path)
  144.             format_lower = output_format.lower()
  145.             if format_lower == 'ico':
  146.                 if not ico_resolution:
  147.                     messagebox.showwarning("提示", "请选择ICO分辨率!")
  148.                     return
  149.                 sizes = [ico_resolutions[ico_resolution]]
  150.                 img.save(f"{output_dir}/output.{formats[output_format]}", format_lower.upper(), sizes=sizes)
  151.             else:
  152.                 img.save(f"{output_dir}/output.{formats[output_format]}", format_lower.upper())
  153.             messagebox.showinfo("成功", f"图片已成功转换并保存到 {output_dir}/output.{formats[output_format]}")
  154.             self.log_message(f"成功保存到 {output_dir}/output.{formats[output_format]}")
  155.         except UnidentifiedImageError:
  156.             messagebox.showerror("错误", "无法识别图片格式!")
  157.             self.log_message("无法识别图片格式!", level="ERROR")
  158.         except Exception as e:
  159.             messagebox.showerror("错误", f"转换失败: {str(e)}")
  160.             self.log_message(f"转换失败: {str(e)}", level="ERROR")
  161.     def log_message(self, message, level="INFO"):
  162.         self.log_area.insert(tk.END, f"[{level}] {message}\n")
  163.         self.log_area.see(tk.END)
  164. def main():
  165.     root = ttk.Window(themename="cosmo")
  166.     app = ImageConverterGUI(root)
  167.     root.mainloop()
  168. if __name__ == "__main__":
  169.     main()
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

发表于 昨天 22:53 | 显示全部楼层
其实有一款免费的xnconvert软件可以替代使用。
回复

使用道具 举报

发表于 昨天 22:54 | 显示全部楼层
反正电脑上装了格式工厂,转个图片就是顺便的事,不过俺还是很羡慕楼主的动手能力,会写代码就是好,一言不合就自己搞一个。
回复

使用道具 举报

发表于 昨天 22:55 | 显示全部楼层
先收藏下这个工具,谢谢了
回复

使用道具 举报

发表于 昨天 22:56 | 显示全部楼层
谢谢分享,先收藏了
回复

使用道具 举报

发表于 昨天 22:56 | 显示全部楼层
谢谢分享,先收藏了
回复

使用道具 举报

发表于 昨天 22:57 | 显示全部楼层
打开有bug,wi10界面显示不全
回复

使用道具 举报

发表于 昨天 22:57 | 显示全部楼层
收藏一下先。
回复

使用道具 举报

发表于 昨天 22:58 | 显示全部楼层
图片格式可以互相转换就很好,特别是可以把喜欢的图片转图标格式,强悍的小软件!赞赞赞!
回复

使用道具 举报

发表于 昨天 22:58 | 显示全部楼层
平时用得着的东西,感谢分享!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表