零基础:100个小案例玩转Python软件开发!第一节:照片换色。

53 阅读7分钟

大家好,欢迎来到我们全新的系列专栏  《零基础:100个小案例玩转Python软件开发!》  !在这个系列里,我们不讲枯燥的理论,只玩最酷的实战。每一课,我都会用一个你工作、学习中真实会遇到的小麻烦作为引子,然后用PyMe这个强大的工具来把它搞定。欢迎各位小伙伴跟着我一起学,如果你觉得有用,就把文章转发给你的朋友们,让我们一起进步!

      想象一下这个场景:明天就要交材料了,你翻遍手机电脑,好不容易找到一张满意的照片,但背景不对——公司要求白底,你的却是生活照;签证要求蓝底,你的却是白底。

     这时候你怎么办?

  • 选项A:  打开PS,回忆抠图技巧,与魔棒、快速选择、钢笔工具搏斗半小时,最后可能边缘还是毛毛糙糙。
  • 选项B:  求助某宝或小程序,花上几块钱甚至几十块,还要担心隐私泄露和图片质量。
  • 选项C:  淡定地运行PyMe,调用Python的相关模块和函数,很快一张背景完美、边缘清晰的新证件照就生成了。

   毫无疑问,我们选择C!今天的第一课,就让我们一起来实现这个“魔法”——用PyMe给证件照智能换背景

   在开始“施法”之前,我们先花1分钟认识一下今天的主角——PyMe。

   简单来说,PyMe是一个 “所见即所得”的开发工具,它主要面向Python开发者,我们打开浏览器,输入官网地址www.py-me.com,然后点击下载按钮并输入bsgn验证码,就可以通过云盘下载到它了。****

图片图片    下载解压之后,我们双击PyMe.exe即可启动它。图片     在初始状态下,我们可以直接点击“确定”按钮,即可创建相应的工程并进入到一个空白的界面编辑视窗。它包括了几个区域:图片

  • 控件和组件:用于选择要创建的控件和组件以拖动到界面上。
  • 主界面:当前编辑的界面
  • 元素层级树:当前界面上的所有控件或组件关系树
  • 设置区域:包括控件的基本属性设置、变量绑定和事件函数绑定。
  • 快捷按钮区域:用于快速对选中的控件进行界面可视化的设置。
  • 文件区域:用于显示当前工程下的所有文件和文件夹。

    在认识了这个界面后,我们从左边的“控件和组件”面板,用鼠标左键点击并拖动Label、Entry、Button和Canvas到界面上松开,创建下面的界面。图片     创建好之后,我们用鼠标右键在Label和按钮上点击,在右边的设置属性面板里,点击对应属性“背景”、“文字”,通过弹出对话框进行设置就可以将其改成下面所示的样子。图片    在“打开”按钮上用鼠标右键单击,在弹出菜单里选择“事件响应”菜单项,然后选择默认的“Command”事件,在右边的事件动作按钮列表中选择“调用其它界面”,这时会弹出一个小对话框,再选择“调用打开文件框”按钮,即可为“打开”按钮绑定点击事件的函数并生成一个打开文件的代码行。图片         在对应的函数中,将Python改为PNG,并换行后调用Fun函数库中的SetCanvasBGImage来将文件设置为画布Canvas_1的背景图,在手动编写代码的过程中,PyMe会自动触发函数提示和参数说明提示,很方便上手,这样我们就完成了打开图片的处理。

    if openPath:        
       Fun.SetText(uiName,'Entry_1',openPath)        
       un.SetCanvasBGImage(界面名称=uiName,控件名称='Canvas_1',图片文件路径=openPath,绘制方式='zoom')

图片    下面我们可以看到,在代码编辑器右边的面板中,有一个微缩小视图,我们点击对应的按钮,然后直接在下方的事件绑定面板就可以通过下拉框中选择事件来绑定函数,这里直接用默认事件进行绑定就可以很快为其它的几个按钮生成点击事件的函数了。图片

下面我们来获取“AI抠图”的神器API

     我们自己写抠图算法太难了,这个AI时代要善于“借力”。我们将使用一个免费、高效的在线AI抠图服务——Remove.bg,下面是具体步骤:

  • 访问 remove.bg 官网。
  • 注册一个免费账户。
  • 在后台找到你的 API Key(通常是一长串字符)。免费账户每月有几十次的调用额度,对我们学习完全足够。

请妥善保管你的API Key,它就是我们的“魔法杖”!

下面我们在当前代码文件中,加入以下代码:

from PIL import Imagefrom removebg 
import RemoveBg#需要到https://www.remove.bg/注册账号,并获取API KEY#比如我这里申请的APK SmvosFhZ4PM9Qu7robsfYd3arm
bg = RemoveBg("SmvosFhZ4PM9Qu7robsfYd3a""error.log")# 老照片路径、新照片路径、无背景照片路径、颜色
def SetImageBGColor(srcImagePath, bgColor):
    rmbg.remove_background_from_img_file(srcImagePath)    
    dropbg_filePath = srcImagePath + "_no_bg.png"    
    foreground = Image.open(dropbg_filePath)    
    background = Image.new('RGBA', foreground.size, bgColor)    
    background.paste(foreground, mask=foreground)    
    return background

然后分别在三个颜色的绑定函数中加入相应代码:

#Button 'Button_2' 's Command Event :
def Button_2_onCommand(uiName,widgetName,threadings=0):    
    srcImagePath = Fun.GetText(uiName,'Entry_1')    
    if srcImagePath:        
        resImage = SetImageBGColor(srcImagePath,(255255255255))
        Fun.SetCanvasBGImage(uiName,'Canvas_1',resImage,'Zoom')
#Button 'Button_3' 's Command Event :
def Button_3_onCommand(uiName,widgetName,threadings=0):
    srcImagePath = Fun.GetText(uiName,'Entry_1')    
    if srcImagePath:        
        resImage = SetImageBGColor(srcImagePath,(128128128255))
        Fun.SetCanvasBGImage(uiName,'Canvas_1',resImage,'Zoom')
#Button 'Button_4' 's Command Event :
def Button_4_onCommand(uiName,widgetName,threadings=0):    
    srcImagePath = Fun.GetText(uiName,'Entry_1')    
    if srcImagePath:        
        resImage = SetImageBGColor(srcImagePath,(67142219255))
        Fun.SetCanvasBGImage(uiName,'Canvas_1',resImage,'Zoom')

    上面的三个按钮所调用的代码基本一样,只是传的颜色值不同,这是一个RGBA的值,它由Removebg将图片的背景色替换为相应的颜色,点击右上角的运行按钮,这时如果未安装removebg会弹出安装提示,点击下方的按钮即可自动进行安装。图片       安装完后点击“重新运行”按钮,即可看到运行的效果,我们将一张白色的图片打开。图片        然后点击“蓝色”按钮,稍等片刻,就可以看到图片的背景色被换为蓝色背景色啦!图片

            最后还有一个保存的按钮,我们在对应的绑定函数中,用鼠标右键单击,在弹出的菜单项“系统函数”下找到子菜单项:“调用保存文件对话框”,就会自动生成相应的保存文件函数。

图片        具体的函数代码实现如下,这里要注意的是,PyMe中的画布背景图片,是保存在以“BGImage ”为名称的控件变量中,这个变量是一个列表,包括三个值,第一个是图片对象生成的的 ImageTk.PhotoImage对象,第二个值是我们通过Fun.SetCanvasBGImage传入的参数,如果传入参数是图片路径,那这里就是图片路径,如果传入参数是Image对象,那这里就是Image对象,上面在点击蓝色按钮时,传入的是替换颜色后的Image对话,所以这里可以获取到它,第三个值是图像在画布中的显示方式,这里是Zoom,就是按控件大小进行图片缩放。

#Button 'Button_5' 's Command Event :def Button_5_onCommand(uiName,widgetName,threadings=0):    savePath = Fun.SaveFile("保存PNG文件",[('PNG File','*.png'),('All files','*')],os.path.abspath('.'),'png')    if savePath:        resImage = Fun.GetUserData(uiName,'Canvas_1','BGImage')        if resImage:            resImage[1].save(savePath)            Fun.MessageBox('保存完成','info','info',None)

       这样我们就完成了保存,试一下吧!图片

       OK,现在我们完成了这个工程,如果你想把它打包成EXE发给朋友使用,可以注册一下PyMe会员,然后点击右上角的“发布”按钮,就可以直接打包成EXE了!

图片

      是不是很有成就感呀!请在评论区留下你的评论,我将抽取1位幸运用户送它10颗AIGC豆~!让我们下一节课再见!