使用Python和Pillow创建照片马赛克应用

在这篇博客中,我们将探讨如何使用Python创建一个简单而有趣的桌面应用程序。我们的目标是构建一个应用,允许用户选择一张照片,然后在照片的右下角添加马赛克效果。这个项目将展示如何结合使用wxPython来创建图形用户界面(GUI)和Pillow库来处理图像。
D:\spiderdocs\eraselogo.py

项目概述

我们的应用程序将具有以下功能:

  1. 一个用于选择照片文件的按钮
  2. 一个用于应用马赛克效果的按钮
  3. 一个显示当前状态的文本标签

当用户点击"添加马赛克"按钮时,程序将在选定照片的右下角添加马赛克效果,并将结果保存为新的图片文件。

所需库

为了构建这个应用,我们需要安装两个主要的库:

  • wxPython: 用于创建图形用户界面
  • Pillow: 用于图像处理

你可以使用pip安装这些库:

pip install wxPython Pillow

全部代码

import wx
import os
from PIL import Image

class PhotoMosaicApp(wx.Frame):
    def __init__(self):
        super().__init__(parent=None, title='Photo Mosaic App')
        panel = wx.Panel(self)
        
        self.photo_path = None
        
        # 创建控件
        self.select_button = wx.Button(panel, label='选择照片')
        self.mosaic_button = wx.Button(panel, label='添加马赛克')
        self.status_text = wx.StaticText(panel, label='请选择一张照片')
        
        # 绑定事件
        self.select_button.Bind(wx.EVT_BUTTON, self.on_select)
        self.mosaic_button.Bind(wx.EVT_BUTTON, self.on_mosaic)
        
        # 设置布局
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.select_button, 0, wx.ALL | wx.CENTER, 5)
        sizer.Add(self.mosaic_button, 0, wx.ALL | wx.CENTER, 5)
        sizer.Add(self.status_text, 0, wx.ALL | wx.CENTER, 5)
        
        panel.SetSizer(sizer)
        self.Show()
    
    def on_select(self, event):
        with wx.FileDialog(self, "选择照片", wildcard="图片文件 (*.jpg;*.png)|*.jpg;*.png",
                           style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) as fileDialog:
            if fileDialog.ShowModal() == wx.ID_CANCEL:
                return
            self.photo_path = fileDialog.GetPath()
            self.status_text.SetLabel(f'已选择: {os.path.basename(self.photo_path)}')
    
    def on_mosaic(self, event):
        if not self.photo_path:
            wx.MessageBox('请先选择一张照片', '提示', wx.OK | wx.ICON_INFORMATION)
            return
        
        try:
            # 打开图片
            img = Image.open(self.photo_path)
            width, height = img.size
            
            # 定义右下角区域
            mosaic_size = min(width, height) // 4
            mosaic_area = (width - mosaic_size, height - mosaic_size, width, height)
            
            # 裁剪右下角区域并缩小
            mosaic = img.crop(mosaic_area).resize((20, 20), Image.NEAREST)
            
            # 将缩小的区域放大回原始大小,形成马赛克效果
            mosaic = mosaic.resize((mosaic_size, mosaic_size), Image.NEAREST)
            
            # 将马赛克区域粘贴回原图
            img.paste(mosaic, (width - mosaic_size, height - mosaic_size))
            
            # 保存结果
            output_path = os.path.splitext(self.photo_path)[0] + '_mosaic.png'
            img.save(output_path)
            
            self.status_text.SetLabel(f'马赛克添加成功,已保存为: {os.path.basename(output_path)}')
        except Exception as e:
            wx.MessageBox(f'处理图片时出错: {str(e)}', '错误', wx.OK | wx.ICON_ERROR)

if __name__ == '__main__':
    app = wx.App()
    frame = PhotoMosaicApp()
    app.MainLoop()

代码实现

让我们逐步实现这个应用程序:

  1. 首先,我们导入必要的模块并创建主应用类:
import wx
import os
from PIL import Image

class PhotoMosaicApp(wx.Frame):
    def 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值