wxPython + opencv 打造自己的图片编辑软件

本文首发于我的简书
GUI采用wxPython,图像处理采用opencv,制作了一款简单的图片处理工具。其效果如下

在这里插入图片描述

主要的功能及实现

选中文件资源管理器中的图片

这个采用tkinter库的filedialog模块很容易实现

    image_path = filedialog.askopenfilename(initialdir=r"..\\", title="select an image whose filename endwiths .jpg/png",filetypes=[ ("JPG", ".jpg"),("PNG", ".png")])

参数一:initialdir是打开文件资源管理器的初始路径,可以不设置

参数二: title是打开的文件资源管理器的最左上方的标题

参数三: filetypes,比如我上面的设置过滤掉了其他非.jpg.png文件

askopenfilename的返回值就是你选择的文件路径

图像处理

我主要加了图片涂鸦、图片黑白化、图片裁剪这几个功能,具体效果参考最上面的效果图,实现的话算法+业务逻辑很容易

算法算是比较简单的算法,但是业务逻辑和其中不少的坑是只有动手后才能深有体会的,这里贴出这部分的主要代码:

def OnImageGrayClicked(self,event):
    if self.isLoaded == True:
        dlg = wx.MessageDialog(self, u"this Operation cannot be undo", u"Warning", wx.YES_NO)
        value = dlg.ShowModal()
        if value == wx.ID_YES:
            self.setImage(cv2.cvtColor(self.image, cv2.COLOR_BGR2GRAY))
            self.editMenu.Check(ID_IMAGE_GRAY, True)
            self.image_gray.Enable(False)
        else:
            self.editMenu.Check(ID_IMAGE_GRAY, False)
        dlg.Destroy()
    else:
        wx.MessageDialog(self, u"please make sure you have loaded the image successfully", u"Warning", wx.OK).ShowModal()
        self.editMenu.Check(ID_IMAGE_GRAY, False)

def OnImageDrawClicked(self,event):
    if self.isLoaded == True:
        self.canDraw = not self.canDraw
        if self.canDraw == True:
            self.image_draw.SetItemLabel("disabel drawing on the image")
            self.image_cut.Enable(False)
        else:
            self.image_draw.SetItemLabel("enabel drawing on the image")
            self.image_cut.Enable(True)
        pass
    else:
        wx.MessageDialog(self, u"please make sure you have loaded the image successfully", u"Warning", wx.OK).ShowModal()

def OnImageCutClicked(self,event):
    if self.isLoaded == True:
        self.canCut = not self.canCut
        if self.canCut == True:
            self.image_copy = self.image.copy()
            self.image_cut.SetItemLabel("disabel cutting on the image")
            self.image_draw.Enable(False)
        else:
            self.image_cut.SetItemLabel("enabel cutting on the image")
            self.image_draw.Enable(True)
        return
    else:
        wx.MessageDialog(self, u"please make sure you have loaded the image successfully", u"Warning", wx.OK).ShowModal()
def OnSettingsLineWeightClicked(self,event):
    self.lineWeight = wx.GetNumberFromUser(message="input the line_weight(from 1 to 10)",
                                   prompt="lineWeight", caption="drawer settings",
                                   value=self.lineWeight,
                                   parent=self.bmp, max=10, min=1)
    print("SLW")
    pass

去掉opencv自带的窗口,把图片绑定到wxPython框架上来

我感觉这部分是最复杂的,需要两个实例,image = cv2.imread()和bitmap = wx.bitmap(),从而搭起一个从opencv到wxPython的桥梁

这里最核心的代码是

def setImage(self,img):
    self.image = img
    img_height, img_width = img.shape[:2]
    try:
        image1 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    except:
        image1 = cv2.cvtColor(img,cv2.COLOR_GRAY2RGB)
    finally:
        pic = wx.Bitmap.FromBuffer(img_width, img_height, image1)
    # 显示图片在panel上
    self.bmp.SetBitmap(pic)

关于代码

设计代码的初衷

在实验室接触到了opencv这个库,感觉太强大了,于是想自己做一款功能比较全面的图片编辑软件,但是一个人的力量有限,我写了一个晚上,只写好了框架和图片裁剪图片黑白化图片涂鸦这几个功能,希望以后有小伙伴一起参与进来
暂时不考虑开源,不过可以下载exe程序体验

链接:https://pan.baidu.com/s/1heSY9U-DJnRinoqihD-eJA
提取码:5k63

裁剪部分单独出一个的demo,点击下载

(小声bb,过了期末考试周就发代码,代码协作也是)

代码更新优化

关于修复闪屏的问题(2018/12/11)

发现使用matplotlib绑定到wxPython上再使用canvas绘图,比用cv2画图再转成bitmap强制刷新到wxPython上要好得多,后者容易闪屏,期末以后再优化。

wxPython是一个开源的Python GUI工具包,它允许Python程序员创建桌面应用程序的图形用户界面。wxPython中的ListCtrl是一个列表控件,它可以用于显示和编辑项目列表。滚动条控件是一种用户界面控件,它允许用户在一个可滚动的区域中查看内容。在wxPython中,可以使用wx.ScrolledWindow类来创建一个带有滚动条的窗口。在这个窗口中,可以添加其他的wxPython控件,例如Panel和ListCtrl。 下面是一个使用wxPython中ListCtrl和滚动条控件的例子: ``` import wx class MyFrame(wx.Frame): def __init__(self, parent): wx.Frame.__init__(self, parent, title="ListCtrl with ScrolledWindow") # 创建一个滚动条控件 scroller = wx.ScrolledWindow(self, -1) # 设置滚动条控件的大小 scroller.SetScrollbars(pixelsPerUnitX=1, pixelsPerUnitY=1, noUnitsX=1000, noUnitsY=800) # 创建一个面板 panel = wx.Panel(scroller) # 创建一个ListCtrl控件 self.list = wx.ListCtrl(panel, -1, style=wx.LC_REPORT) # 添加列 self.list.InsertColumn(0, "Name") self.list.InsertColumn(1, "Age") # 添加行 self.list.InsertItem(0, "Alice") self.list.SetItem(0, 1, "25") self.list.InsertItem(1, "Bob") self.list.SetItem(1, 1, "30") self.list.InsertItem(2, "Charlie") self.list.SetItem(2, 1, "35") # 设置ListCtrl控件的布局 vbox = wx.BoxSizer(wx.VERTICAL) vbox.Add(self.list, 1, wx.EXPAND) panel.SetSizer(vbox) # 设置窗口的布局 hbox = wx.BoxSizer(wx.HORIZONTAL) hbox.Add(scroller, 1, wx.EXPAND) self.SetSizer(hbox) self.Show() app = wx.App() frame = MyFrame(None) app.MainLoop() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月小水长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值