python實現書法碑帖圖片分割
本文實例為大傢分享瞭python實現書法碑帖圖片分割的具體代碼,供大傢參考,具體內容如下
一、功能實現效果
1、選擇要分割的碑帖圖片
2、選擇碑帖圖像分割的行與列,本例的行為:5,列為:4。如何點擊“確定行列”
3、輸入對於碑帖的內容,點擊“確定分割”按鈕。
4、在輸出文件夾生成瞭單字版圖片,並對應內容命名。方便集字、創作與學習。
二、Python代碼實現
1、getimgdir.py
import wx import os from PIL import Image import numpy as np #import wx.grid #import row_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", "", "", "all files (*.*)|*.*", 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
import wx import numpy as np import sys import time import os class MyFrame(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() if h1>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) # 將回調函數與按鍵事件綁定 def OnClick(self, event): # 回調函數事件 self.button.SetLabel("提交成功") # 設置 self.ClickNum += 1 if self.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() class App(wx.App): def OnInit(self): frame = MyFrame() frame.Show() return True app = App() app.MainLoop() #time.sleep(2) #sys.exit(0)
3、row_col_show.py
import wx import numpy as np import threading import time from PIL import Image,ImageDraw def draw_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] for i in range(a): draw.line((0, d*(i+1)/a) + (c,d*(i+1)/a), fill=128, width=5) #線的起點和終點,線寬 for j in range(b): draw.line((c*(j+1)/b,0) + (c*(j+1)/b,d), fill=128, width=6) return(im.save("00.jpeg")) class MyFrame(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() if h1 > 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)) for i in range(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) # 將回調函數與按鍵事件綁定 def OnClick(self, event): # 回調函數事件 self.button.SetLabel("提交成功") # 設置 self.ClickNum += 1 if self.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() class App(wx.App): def OnInit(self): frame = MyFrame() frame.Show() return True app = App() app.MainLoop()
4、split_copybook.py
# -*- coding: utf-8 -*- import wx import os from PIL import Image import numpy as np #import wx.grid #import row_col #row_col ####################################################################################### data_a = np.load('dir.npz') src=str(data_a['k_a'])#地址 def splitimage(src, rownum, colnum, dstpath): #分割圖像,(輸入圖片路徑,分割行數,分割列數,輸出圖片路徑) img = Image.open(src) src=src.replace('jpg','jpeg') print(src) #os.getcwd() w, h = img.size if rownum <= h and colnum <= w: print('原碑帖圖片信息: %sx%s, %s, %s' % (w, h, img.format, img.mode)) print('
5、main.py
import os 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')
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 基於Python實現交互式文件瀏覽器
- 火遍網絡的python中秋節賀卡現在學還趕得上
- python光學仿真學習wxpython創建手速測試程序
- Python對接PicGo實現圖片自動加水印並上傳操作示例
- 用python刪除文件夾中的重復圖片(圖片去重)