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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。