如何使用 python 中的 Pillow 创建可自定义的图标生成器

在本篇博客中,我们将探讨如何使用 wxPythonPillow 库创建一个简单的图标生成器。用户可以通过该工具选择目标文件夹,并生成三种不同尺寸(16x16、48x48、128x128)的PNG格式图标文件。图标将采用"截图框"的主题,通过图形化方式展示如何快速生成自定义图标。

C:\pythoncode\new\createicon3size.py

全部代码

python 复制代码
import wx
from PIL import Image, ImageDraw
import os

class IconGenerator(wx.Frame):
    def __init__(self, parent, title):
        super().__init__(parent, title=title, size=(600, 400))

        # 创建面板
        panel = wx.Panel(self)

        # 创建控件
        self.folder_picker = wx.DirPickerCtrl(panel, path="", size=(500, -1), pos=(50, 50))
        self.generate_button = wx.Button(panel, label="生成图标", pos=(50, 150))

        # 绑定事件
        self.generate_button.Bind(wx.EVT_BUTTON, self.on_generate)

        self.Show()

    def on_generate(self, event):
        # 获取目标文件夹路径
        target_folder = self.folder_picker.GetPath()
        if not target_folder:
            wx.MessageBox("请选择目标文件夹", "错误", wx.ICON_ERROR)
            return
        
        # 生成图标并保存为 PNG 文件
        self.generate_icons(target_folder)

    def generate_icons(self, target_folder):
        sizes = [16, 48, 128]
        for size in sizes:
            file_path = os.path.join(target_folder, f"icon{size}.png")
            self.create_icon(size, file_path)
        
        wx.MessageBox("图标已成功生成", "成功", wx.ICON_INFORMATION)

    def create_icon(self, size, file_path):
        # 创建空白图像,背景色为白色
        img = Image.new('RGBA', (size, size), (255, 255, 255, 0))
        draw = ImageDraw.Draw(img)
        
        # 在图标上绘制一个简单的框架,模拟截图效果
        border_thickness = size // 10  # 边框厚度与图标大小成比例
        
        # 绘制外框
        draw.rectangle([border_thickness, border_thickness, size-border_thickness, size-border_thickness], outline="black", width=border_thickness)
        
        # 绘制截取区域的对角线(模拟截图效果)
        line_offset = size // 4
        draw.line([line_offset, line_offset, size-line_offset, size-line_offset], fill="black", width=2)
        draw.line([line_offset, size-line_offset, size-line_offset, line_offset], fill="black", width=2)
        
        # 保存为 PNG 文件
        img.save(file_path, format="PNG")
        print(f"图标 {file_path} 已生成!")

if __name__ == "__main__":
    app = wx.App(False)
    IconGenerator(None, title="图标生成器")
    app.MainLoop()

项目目标

我们希望创建一个桌面应用程序,用户能够:

  1. 选择目标文件夹。
  2. 生成不同尺寸的图标(16x16、48x48、128x128)。
  3. 以 PNG 格式保存图标,命名为 icon16.pngicon48.pngicon128.png
  4. 使用简单的框架和对角线来模拟截图框的效果,作为图标的主题。

所需的库

为了实现这个功能,我们将使用以下 Python 库:

  • wxPython:这是一个跨平台的 GUI 库,用于创建图形用户界面(GUI)。
  • Pillow:这是 Python 中处理图像的库,用于绘制和保存图标。

首先,确保你的环境中已经安装了这两个库。可以通过以下命令安装:

bash 复制代码
pip install wxPython Pillow

设计思路

我们的图标将有一个简单的设计,包含:

  1. 一个框架,模拟截图工具的选择区域。
  2. 两条交叉的线,模拟截图区域的边界。

图标将以三种不同的尺寸生成:16x16、48x48 和 128x128,以确保适配不同的应用场景,如应用程序图标、任务栏图标等。

步骤 1:创建 wxPython 窗口

我们首先创建一个简单的 wxPython 窗口,包含:

  • 一个文件夹选择控件,让用户选择图标保存的目标文件夹。
  • 一个按钮,当点击按钮时生成图标。
python 复制代码
import wx
from PIL import Image, ImageDraw
import os

class IconGenerator(wx.Frame):
    def __init__(self, parent, title):
        super().__init__(parent, title=title, size=(600, 400))

        # 创建面板
        panel = wx.Panel(self)

        # 创建控件
        self.folder_picker = wx.DirPickerCtrl(panel, path="", size=(500, -1), pos=(50, 50))
        self.generate_button = wx.Button(panel, label="生成图标", pos=(50, 150))

        # 绑定事件
        self.generate_button.Bind(wx.EVT_BUTTON, self.on_generate)

        self.Show()

    def on_generate(self, event):
        # 获取目标文件夹路径
        target_folder = self.folder_picker.GetPath()
        if not target_folder:
            wx.MessageBox("请选择目标文件夹", "错误", wx.ICON_ERROR)
            return
        
        # 生成图标并保存为 PNG 文件
        self.generate_icons(target_folder)

    def generate_icons(self, target_folder):
        sizes = [16, 48, 128]
        for size in sizes:
            file_path = os.path.join(target_folder, f"icon{size}.png")
            self.create_icon(size, file_path)
        
        wx.MessageBox("图标已成功生成", "成功", wx.ICON_INFORMATION)

    def create_icon(self, size, file_path):
        # 创建空白图像,背景色为白色
        img = Image.new('RGBA', (size, size), (255, 255, 255, 0))
        draw = ImageDraw.Draw(img)
        
        # 在图标上绘制一个简单的框架,模拟截图效果
        border_thickness = size // 10  # 边框厚度与图标大小成比例
        
        # 绘制外框
        draw.rectangle([border_thickness, border_thickness, size-border_thickness, size-border_thickness], outline="black", width=border_thickness)
        
        # 绘制截取区域的对角线(模拟截图效果)
        line_offset = size // 4
        draw.line([line_offset, line_offset, size-line_offset, size-line_offset], fill="black", width=2)
        draw.line([line_offset, size-line_offset, size-line_offset, line_offset], fill="black", width=2)
        
        # 保存为 PNG 文件
        img.save(file_path, format="PNG")
        print(f"图标 {file_path} 已生成!")

步骤 2:创建图标并保存为 PNG

图标的生成过程通过 Pillow 库完成。我们将创建一个空白的图像,并通过 ImageDraw 类绘制框架和交叉线,模拟截图区域。每个图标会根据不同的尺寸保存为 PNG 格式。

python 复制代码
def create_icon(self, size, file_path):
    # 创建空白图像,背景色为白色
    img = Image.new('RGBA', (size, size), (255, 255, 255, 0))
    draw = ImageDraw.Draw(img)
    
    # 绘制外框
    border_thickness = size // 10
    draw.rectangle([border_thickness, border_thickness, size-border_thickness, size-border_thickness], outline="black", width=border_thickness)
    
    # 绘制对角线,模拟截图效果
    line_offset = size // 4
    draw.line([line_offset, line_offset, size-line_offset, size-line_offset], fill="black", width=2)
    draw.line([line_offset, size-line_offset, size-line_offset, line_offset], fill="black", width=2)
    
    # 保存为 PNG 文件
    img.save(file_path, format="PNG")
    print(f"图标 {file_path} 已生成!")

步骤 3:保存图标并显示消息

每个图标将以 PNG 格式保存到用户选择的目标文件夹。完成后,程序会弹出一个消息框,提示用户图标已成功生成。

步骤 4:运行程序

将以上代码保存为一个 Python 文件,并运行程序。你将看到一个简单的窗口,用户可以选择目标文件夹并点击"生成图标"按钮。当点击按钮后,程序将根据选择的文件夹生成三个不同尺寸的图标文件(icon16.pngicon48.pngicon128.png)。

结果与展示

假设你选择的目标文件夹路径是 C:/Users/YourUsername/Desktop/icons,运行程序后,生成的图标文件将保存在该目录下:

  • icon16.png:16x16 像素
  • icon48.png:48x48 像素
  • icon128.png:128x128 像素

这些图标将用于各种应用场景,如在应用程序中作为程序图标,或者作为系统托盘图标等。

运行结果

总结

本项目展示了如何结合 wxPythonPillow 创建一个简单的图标生成器。用户可以通过 GUI 选择目标文件夹,并生成不同尺寸的 PNG 格式图标。这种工具对于需要生成不同尺寸图标的开发者非常有用,尤其是在需要图标适配多种设备和分辨率时。

相关推荐
databook2 小时前
Manim实现闪光轨迹特效
后端·python·动效
Juchecar3 小时前
解惑:NumPy 中 ndarray.ndim 到底是什么?
python
用户8356290780513 小时前
Python 删除 Excel 工作表中的空白行列
后端·python
Json_3 小时前
使用python-fastApi框架开发一个学校宿舍管理系统-前后端分离项目
后端·python·fastapi
数据智能老司机10 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机11 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机11 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机11 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i11 小时前
drf初步梳理
python·django
每日AI新事件11 小时前
python的异步函数
python