python实现书法碑帖图片分割
本文实例为大家分享了python实现书法碑帖图片分割的具体代码,供大家参考,具体内容如下
一、功能实现效果
1、选择要分割的碑帖图片
2、选择碑帖图像分割的行与列,本例的行为:5,列为:4。如何点击“确定行列”
3、输入对于碑帖的内容,点击“确定分割”按钮。
4、在输出文件夹生成了单字版图片,并对应内容命名。方便集字、创作与学习。
二、Python代码实现
1、getimgdir.py
importwx importos fromPILimportImage importnumpyasnp #importwx.grid #importrow_col #row_col ####################################################################################### app=wx.App()#wx.App()行创建了一个应用程序对象。每个wx程序都需要一个.App()对象 frame=wx.Frame(None,-1,'请选择待分割的图片文件')#wx.Frame()方法返回一个可以包含小部件的新窗口 frame.SetSize(0,0,600,300)#函数设置位置和大小(x(左),y(顶部),宽度,高度) openFileDialog=wx.FileDialog(frame,"Open","","", "allfiles(*.*)|*.*", wx.FD_OPEN|wx.FD_FILE_MUST_EXIST) openFileDialog.ShowModal()#显示窗口 src=openFileDialog.GetPath()#返回文件的完整路径(如果选择了一个) np.savez('dir.npz',k_a=src) openFileDialog.Destroy()
2、row_col.py
importwx importnumpyasnp importsys importtime importos classMyFrame(wx.Frame): ClickNum=0 def__init__(self):#__init__(self)是类的初始化方法,也称构造方法,是一种特殊的魔法方法。__init__(self)在实例化后,会自动调用,而不用手动调用,所以一般把属性设置在_init__()里。 super().__init__(parent=None,title="图像分割行数与列数",size=(500,730))#初始化窗口信息 panel=wx.Panel(self)#框架的父窗口。对于顶级窗口,这个值是None。#创建面板 #模块1选择签约主体 self.Center() text1=wx.StaticText(parent=panel,id=-1,pos=(10,7),label="图像分割行数:") list1=["1","2","3","4","5","6","7","8","9","10"] self.combobox1=wx.ComboBox(parent=panel,id=-1,pos=(100,5),value="5",choices=list1)#wx.ComboBox默认它的文本框是可以修改的 text2=wx.StaticText(parent=panel,id=-1,pos=(250,7),label="图像分割列数:") list2=["1","2","3","4","5","6","7","8","9","10"] self.combobox2=wx.ComboBox(parent=panel,id=-1,pos=(350,5),value="4",choices=list2)#wx.ComboBox默认它的文本框是可以修改的 datadir=np.load('dir.npz') imgdir=str(datadir['k_a']) copybookimg=wx.Bitmap(imgdir,wx.BITMAP_TYPE_ANY) img=wx.Image(imgdir) w1,h1=copybookimg.GetSize() ifh1>400: neww1=(400*w1)/h1 newh1=400 img2=img.Scale(int(neww1),newh1) img2=wx.Bitmap(img2) self.image=wx.StaticBitmap(panel,-1,img2,pos=(10,90)) st1=wx.StaticText(panel,-1,"字帖内容:",pos=(10,505)) self.txt1=wx.TextCtrl(panel,-1,pos=(60,530),size=(int(13.26*1+23.5),140),style=wx.TE_MULTILINE) #提交模块 self.button=wx.Button(panel,-1,"确定行列",pos=(200,40),size=(60,30))#在面板上添加控件 self.Bind(wx.EVT_BUTTON,self.OnClick,self.button)#将回调函数与按键事件绑定 defOnClick(self,event):#回调函数事件 self.button.SetLabel("提交成功")#设置 self.ClickNum+=1 ifself.ClickNum%2==1:#根据按下次数判断 self.button.SetLabel("已经提交")#修改按键的标签 a=self.combobox1.GetValue() b=self.combobox2.GetValue() np.savez('abc.npz',k_a=a,k_b=b) #time.sleep(0.1) self.Close() classApp(wx.App): defOnInit(self): frame=MyFrame() frame.Show() returnTrue app=App() app.MainLoop() #time.sleep(2) #sys.exit(0)
3、row_col_show.py
importwx importnumpyasnp importthreading importtime fromPILimportImage,ImageDraw defdraw_line(dir,a,b): im=Image.open(dir) draw=ImageDraw.Draw(im)#实例化一个对象 #a#行图像的宽:im.size[0] #b#列图像的高:im.size[1] a=int(a) b=int(b) c=im.size[0] d=im.size[1] foriinrange(a): draw.line((0,d*(i+1)/a)+(c,d*(i+1)/a),fill=128,width=5)#线的起点和终点,线宽 forjinrange(b): draw.line((c*(j+1)/b,0)+(c*(j+1)/b,d),fill=128,width=6) return(im.save("00.jpeg")) classMyFrame(wx.Frame): ClickNum=0 def__init__( self):#__init__(self)是类的初始化方法,也称构造方法,是一种特殊的魔法方法。__init__(self)在实例化后,会自动调用,而不用手动调用,所以一般把属性设置在_init__()里。 super().__init__(parent=None,title="图像分割行数与列数",size=(500,730))#初始化窗口信息 panel=wx.Panel(self)#框架的父窗口。对于顶级窗口,这个值是None。#创建面板 #模块1选择签约主体 self.Center() data_a=np.load('abc.npz') split_row=int(data_a['k_a'])#读取行数 split_col=int(data_a['k_b'])#读取列数 text1=wx.StaticText(parent=panel,id=-1,pos=(10,7),label="图像分割行数:") list1=["1","2","3","4","5","6","7","8","9","10"] self.combobox1=wx.ComboBox(parent=panel,id=-1,pos=(100,5),value=str(split_row), choices=list1)#wx.ComboBox默认它的文本框是可以修改的 text2=wx.StaticText(parent=panel,id=-1,pos=(250,7),label="图像分割列数:") list2=["1","2","3","4","5","6","7","8","9","10"] self.combobox2=wx.ComboBox(parent=panel,id=-1,pos=(350,5),value=str(split_col), choices=list2)#wx.ComboBox默认它的文本框是可以修改的 datadir=np.load('dir.npz') imgdir=str(datadir['k_a']) copybookimg=wx.Bitmap(imgdir,wx.BITMAP_TYPE_ANY) #img=wx.Image(imgdir) draw_line(imgdir,str(split_row),str(split_col)) img3=wx.Image("00.jpeg") w1,h1=copybookimg.GetSize() ifh1>400: neww1=(400*w1)/h1 newh1=400 img2=img3.Scale(neww1,newh1) img2=wx.Bitmap(img2) self.image=wx.StaticBitmap(panel,-1,img2,pos=(10,90)) st1=wx.StaticText(panel,-1,"字帖内容:",pos=(10,505)) foriinrange(split_col): wx.StaticText(panel,-1,"第"+str(i+1)+"列:",pos=(10,530+20*i)) self.txt1=wx.TextCtrl(panel,-1,pos=(60,530),size=(13.26*split_row+23.5,split_col*20),style=wx.TE_MULTILINE) #提交模块 self.button=wx.Button(panel,-1,"确定分割",pos=(400,650),size=(60,30))#在面板上添加控件 self.Bind(wx.EVT_BUTTON,self.OnClick,self.button)#将回调函数与按键事件绑定 defOnClick(self,event):#回调函数事件 self.button.SetLabel("提交成功")#设置 self.ClickNum+=1 ifself.ClickNum%2==1:#根据按下次数判断 self.button.SetLabel("已经提交")#修改按键的标签 a=self.combobox1.GetValue() b=self.combobox2.GetValue() c=self.txt1.GetValue() np.savez('abc.npz',k_a=a,k_b=b,k_c=c)#k_c=c碑帖内容保存npz文件 self.Close() classApp(wx.App): defOnInit(self): frame=MyFrame() frame.Show() returnTrue app=App() app.MainLoop()
4、split_copybook.py
#-*-coding:utf-8-*- importwx importos fromPILimportImage importnumpyasnp #importwx.grid #importrow_col #row_col ####################################################################################### data_a=np.load('dir.npz') src=str(data_a['k_a'])#地址 defsplitimage(src,rownum,colnum,dstpath):#分割图像,(输入图片路径,分割行数,分割列数,输出图片路径) img=Image.open(src) src=src.replace('jpg','jpeg') print(src) #os.getcwd() w,h=img.size ifrownum<=handcolnum<=w: print('原碑帖图片信息:%sx%s,%s,%s'%(w,h,img.format,img.mode)) print('
5、main.py
importos os.system("python./getimgdir.py") os.system("python./row_col.py") os.system("python./row_col_show.py") os.system("python./split_copybook.py") os.unlink('00.jpeg') os.unlink('abc.npz') os.unlink('dir.npz')
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。