Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #======================================================
- # Generateur de motifs de point de croix
- # gmpc.py
- # Ecrit par G.D. Walters
- # Cree pour Full Circle Magazine numeros 85, 86, 87, 88
- #======================================================
- from Tkinter import *
- import tkFileDialog
- import tkCommonDialog
- import tkMessageBox
- import ttk
- from PIL import Image,ImageTk,ImageOps
- import Pmw
- import apsw # acces a la base de donnees
- import math # bibliotheque mathematique
- import sys
- class XStitch:
- def __init__(self, principal):
- self.formatsImages = [
- ('JPEG / JFIF','*.jpg'),
- ('Portable Network Graphics','*.png'),
- ('CompuServer GIF','*.gif'),
- ('Windows Bitmap','*.bmp'),
- ('Tous les types *.*','*.*'),
- ]
- self.openimage = PhotoImage(file='open.gif')
- self.DefaultImage =ImageTk.PhotoImage(self.Apercu("default.jpg",450,450))
- #-------------------------------------------
- # Definitions globales
- #-------------------------------------------
- # pour l'interface graphique
- global NomFichierOriginal
- NomFichierOriginal = StringVar()
- global NombreCouleursOriginal
- NombreCouleursOriginal = StringVar()
- global TailleOriginal
- TailleOriginal = StringVar()
- global ImageOriginale
- ImageOriginale = StringVar()
- global ComboTaillePoints
- ComboTaillePoints = IntVar()
- global ComboTaille
- ComboTaille = StringVar()
- global LargeurTissu
- LargeurTissu = DoubleVar()
- global HauteurTissu
- HauteurTissu = DoubleVar()
- global MaxCouleurs
- MaxCouleurs = IntVar()
- global TailleBordure
- TailleBordure = DoubleVar()
- global CouleursTraitees
- CouleursTraitees = StringVar()
- global TailleTraitee
- TailleTraitee = StringVar()
- global CouleurDMC
- CouleurDMC = StringVar()
- #-------------------------------------------
- global AfficherGrille
- AfficherGrille = True
- global ImageTraitee
- ImageTraitee = ""
- global GrilleImage
- GrilleImage = ""
- global couleurFond1
- couleurFond1 = (120,)*3
- global couleurFond2
- couleurFond2 = (0,)*3
- global PretPourTraitement
- PretPourTraitement = False
- #-------------------------
- self.OuvrirBase()
- self.FabriquerMenu(principal)
- frm = self.ConstruireWidgets(principal)
- self.PlacerWidgets(frm)
- #======================================================
- # DEBUT DEFINITION INTERFACE
- #======================================================
- def FabriquerMenu(self,principal):
- menu = Menu(principal)
- racine.config(menu=menu)
- menuFichier = Menu(menu, tearoff=0)
- Traitement = Menu(menu,tearoff=0)
- Aide = Menu(menu,tearoff=0)
- #-------------------------------------------
- # Menu Fichier
- #-------------------------------------------
- menu.add_cascade(label="Fichier", menu=menuFichier)
- menu.add_cascade(label="Traitement",menu=Traitement)
- menu.add_cascade(label="Aide",menu=Aide)
- menuFichier.add_command(label="Nouveau")
- menuFichier.add_command(label="Ouvrir", command=self.RecupererNomFichier)
- menuFichier.add_command(label="Sauver", command=self.SauverFichier)
- menuFichier.add_separator()
- menuFichier.add_command(label="Quitter", command=self.Quitter)
- #-------------------------------------------
- # Menu Traitement
- #-------------------------------------------
- Traitement.add_command(label="Tous",command=self.Traitement1)
- #-------------------------------------------
- # Menu Aide
- #-------------------------------------------
- Aide.add_command(label="Aide",command=self.AfficherAide)
- Aide.add_separator()
- Aide.add_command(label="A propos",command=self.AfficherApropos)
- def ConstruireWidgets(self,principal):
- self.frame = Frame(principal,width=1024,height=850)
- # ---------------- FENETRE HAUT ---------------------
- self.frm1 = Frame(self.frame,width=1024,height=100,bd=4,relief=GROOVE)
- self.label1 = Label(self.frm1,text = "Fichier original : ")
- self.entNomFic = Entry(self.frm1,width=50,textvariable=NomFichierOriginal)
- self.btnNomFic = Button(self.frm1,width=28,image=self.openimage,command=self.RecupererNomFichier)
- self.label2 = Label(self.frm1,text = "Nb couleurs de l'original : ")
- self.lblNombreCouleursOriginal = Label(self.frm1,text="",width=10,textvariable=NombreCouleursOriginal)
- self.label3 = Label(self.frm1,text = "Taille de l'original : ")
- self.lblTailleOriginal = Label(self.frm1,text="",width=10,textvariable=TailleOriginal)
- # --------------- FENETRE MILIEU --------------------
- self.frm2 = Frame(self.frame,width=1024,height=160,bd=4,relief=GROOVE)
- self.lbl4 = Label(self.frm2,text="Taille des points de l'aida : ")
- self.lbl5 = Label(self.frm2,text="Taille du tissu Aida : ")
- self.TCombobox1 = ttk.Combobox(self.frm2,textvariable=ComboTaillePoints,width=8)
- self.TCombobox1.bind('<<ComboboxSelected>>', self.ChoixTaillePoints)
- self.TCombobox1['values'] = (7,10,11,12,14,16,18,22)
- self.TCombobox2 = ttk.Combobox(self.frm2,textvariable=ComboTaille,width = 8)
- self.TCombobox2.bind('<<ComboboxSelected>>',self.ChoixTailleAida)
- self.TCombobox2['values'] = ("12x18","15x18","30")
- self.lbl6 = Label(self.frm2,text="Nb max de couleurs : ")
- self.entMaxCouleurs = Entry(self.frm2,textvariable=MaxCouleurs,width=3)
- self.lbl7 = Label(self.frm2,text="Taille bordure : ")
- self.entTailleBordure = Entry(self.frm2,textvariable=TailleBordure,width = 8)
- self.frmLine = Frame(self.frm2,width=6,height=80,bd=3,relief="raised")
- self.lbl8 = Label(self.frm2,text="Couleurs traitees : ")
- self.lbl9 = Label(self.frm2,text="Nb points traites : ")
- self.lblCouleursTraitees=Label(self.frm2,width=10,textvariable=CouleursTraitees,justify=LEFT)
- self.lblTailleTraitee=Label(self.frm2,width=10,textvariable=TailleTraitee,justify=LEFT)
- self.btnDoIt = Button(self.frm2,text="Traitement",width=11,command = self.Traitement1)
- self.btnAfficherGrille = Button(self.frm2,text="Masquer grille",width=11,command=self.AfficherMasquerGrille)
- ComboTaillePoints.set(14)
- ComboTaille.set("15x18")
- LargeurTissu.set(15)
- HauteurTissu.set(18)
- MaxCouleurs.set(50)
- TailleBordure.set(1.0)
- # --------------- FENETRE BAS -----------------------
- self.frm3 = Frame(self.frame,width=1024,height=768,bd=4,relief=GROOVE)
- self.lblImageL = Label(self.frm3,image=self.DefaultImage,height=500,width=500,borderwidth=2,relief=GROOVE,textvariable=ImageOriginale)
- self.lblImageR = Label(self.frm3,image=self.DefaultImage,height=500,width=500,borderwidth=2,relief=GROOVE)
- #---------------- FENETRE COTE ----------------------
- self.frm4 = Frame(self.frame,width = 300,height=610,bd=4,relief=GROOVE)
- self.lbl20 = Label(self.frm4,text="Liste couleurs traitees",width = 50)
- # Cree la fenetre deroulante
- self.sf = Pmw.ScrolledFrame(self.frm4,
- labelpos = 'n', label_text = 'Liste couleurs traitees',
- usehullsize = 1,
- hull_width = 300,
- hull_height = 590,
- )
- return self.frame
- def PlacerWidgets(self,fenetre):
- fenetre.grid(column = 0, row = 0)
- # ---------------- FENETRE HAUT ---------------------
- self.frm1.grid(column=0,row=0,rowspan=2,sticky="new")
- self.label1.grid(column=0,row=0,sticky='w')
- self.entNomFic.grid(column=1,row=0,sticky='w',columnspan = 5)
- self.btnNomFic.grid(column=7,row = 0,sticky='w')
- self.label2.grid(column=9,row=0,sticky='w',padx=10)
- self.lblNombreCouleursOriginal.grid(column=10,row=0,sticky='w')
- self.label3.grid(column=9,row=1,sticky='w',padx=10,pady=5)
- self.lblTailleOriginal.grid(column=10,row=1,sticky='w')
- # ---------------- FENETRE MILIEU -------------------
- self.frm2.grid(column=0,row=2,rowspan=2,sticky="new")
- self.lbl4.grid(column=0,row=0,sticky="new",pady=5)
- self.lbl5.grid(column=0,row=1,sticky="new")
- self.TCombobox1.grid(column=1,row=0,sticky="new",pady=5)
- self.TCombobox2.grid(column=1,row=1,sticky="new")
- self.lbl6.grid(column=2,row = 0,sticky="new",padx=5,pady=5)
- self.entMaxCouleurs.grid(column=3,row=0,sticky="new",pady=5)
- self.lbl7.grid(column=2,row=1,sticky='new',padx=5)
- self.entTailleBordure.grid(column=3,row=1,sticky='new')
- self.frmLine.grid(column=4,row=0,rowspan=2,sticky='new',padx=15)
- self.lbl8.grid(column=5,row=0,sticky='new',pady=5)
- self.lbl9.grid(column=5,row=1,sticky='new',pady=5)
- self.lblCouleursTraitees.grid(column=6,row=0,sticky='w',pady=5)
- self.lblTailleTraitee.grid(column=6,row=1,sticky='new',pady=5)
- self.btnDoIt.grid(column=7,row=0,sticky='e',padx=5,pady = 5)
- self.btnAfficherGrille.grid(column=7,row=1,sticky='e',padx=5,pady = 5)
- # ---------------- FENETRE BAS ----------------------
- self.frm3.grid(column=0,row=4,sticky="nsew")
- self.lblImageL.grid(column=0,row=0,sticky="w")
- self.lblImageR.grid(column=1,row=0,sticky="e")
- # ---------------- FENETRE COTE ---------------------
- self.frm4.grid(column=2,row=0,rowspan=12,sticky="new")
- #self.lbl20.grid(column=0,row=0,columnspan=2,sticky='ewn')
- self.sf.grid(column=0,row=1)
- self.sfFrame = self.sf.interior()
- self.lblch1 = Label(self.sfFrame,text=" Original")
- self.lblch2 = Label(self.sfFrame,text=" DMC")
- self.lblch3 = Label(self.sfFrame,text="Nom/Numero")
- self.lblch1.grid(column=0,row=0,sticky='w')
- self.lblch2.grid(column=1,row=0,sticky='w')
- self.lblch3.grid(column=2,row=0,sticky="w")
- #======================================================
- # FIN DEFINITION INTERFACE
- #======================================================
- def RecupererNomFichier(self):
- global PretPourTraitement
- #---------------------------------
- NomFic = tkFileDialog.askopenfilename(parent=racine,filetypes=self.formatsImages ,title="Choisir le fichier a ouvrir...")
- print NomFic
- NomFichierOriginal.set(NomFic)
- NombreCouleursOriginal.set(self.RecupererNbCouleurs(NomFic))
- TailleOriginal.set(self.RecupererHauteurLargeur(NomFic))
- imageMaitresse=Image.open(NomFic)
- imageMaitresse.thumbnail((500,500))
- self.img = ImageTk.PhotoImage(imageMaitresse)
- self.lblImageL['image'] = self.img
- PretPourTraitement = True
- def Apercu(self,fichier,tailleH,tailleV):
- taille = tailleH,tailleV
- posExt = fichier.rfind(".")
- fichierSortie = fichier[:posExt] + ".thumbnail"
- im = Image.open(fichier)
- im.thumbnail(taille)
- im.save(fichierSortie,"JPEG")
- return im
- def InfoOriginal(self,fichier):
- im = Image.open(fichier)
- imFormat = im.format
- imTaille = im.size
- imMode = im.mode
- self.taille = imTaille
- self.imformat = imFormat
- self.immode = imMode
- def RecupererNbCouleurs(self,fichier):
- im = Image.open(fichier)
- nbCouleurs = im.getcolors(1600000)
- self.couleurs = len(nbCouleurs)
- print self.couleurs
- return self.couleurs
- def RecupererHauteurLargeur(self,fichier):
- im = Image.open(fichier)
- tmp = "{0}x{1}".format(im.size[0],im.size[1])
- print tmp
- return tmp
- def RecupererHauteurLargeur2(self,fichier):
- im = Image.open(fichier)
- return im.size[0],im.size[1]
- def RecupererCouleurs(self,image):
- nbCouleurs = image.getcolors(1600000)
- couleurs = len(nbCouleurs)
- print couleurs
- def Traitement1(self):
- #---------------------------------
- # Reduire couleurs
- # Redimensionner image
- # Placer image dans bon label
- global PretPourTraitement
- #---------------------------------
- if PretPourTraitement == False:
- tkMessageBox.showinfo(title="ERREUR...",message='Vous devez charger une image originale.')
- else:
- nouvelleImage = self.Pixeliser(NomFichierOriginal.get(),5)
- Reduite = self.ReduireCouleurs(nouvelleImage)
- L,H = self.RecupererHauteurLargeur2(Reduite)
- tail = "{0}x{1}".format(L/5,H/5)
- TailleTraitee.set(tail)
- # Placer image
- self.im2=Image.open(Reduite)
- self.im2.thumbnail((500,500))
- self.img3 = ImageTk.PhotoImage(self.im2)
- self.lblImageR['image'] = self.img3
- self.ImageTraitee = 'im1.png'
- self.DessinerLignes(Reduite,5)
- self.DessinerLignes2('output.png',50)
- self.im2 = Image.open('output2.png')
- self.im2.thumbnail((500,500))
- self.img3 = ImageTk.PhotoImage(self.im2)
- self.lblImageR['image'] = self.img3
- self.RemplirListeDeroulante('output.png')
- self.GrilleImage = 'output2.png'
- def Pixeliser(self,im,taillePixel):
- image = Image.open(im)
- self.RecupererCouleurs(image)
- image = image.resize((image.size[0]/taillePixel, image.size[1]/taillePixel),Image.NEAREST)
- image = image.resize((image.size[0]*taillePixel, image.size[1]*taillePixel),Image.NEAREST)
- self.RecupererCouleurs(image)
- #image.show()
- image.save('newimage.png')
- return 'newimage.png'
- def ReduireCouleurs(self,NomImage):
- #Reduire couleurs
- nbCouleurs=MaxCouleurs.get()
- print("NbCouleurs={0}".format(nbCouleurs))
- image = Image.open(NomImage)
- output = image.convert('P', palette=Image.ADAPTIVE, colors=nbCouleurs)
- x = output.convert("RGB")
- self.RecupererCouleurs(x)
- nbCouleurs = x.getcolors()
- CouleursTraitees.set(len(nbCouleurs))
- for i in nbCouleurs:
- print i
- x.save('im1.png')
- return 'im1.png'
- def DessinerLignes(self,im,taillePixel):
- global couleurFond1
- #---------------------------------
- image = Image.open(im)
- pixel = image.load()
- for i in range(0,image.size[0],taillePixel):
- for j in range(0,image.size[1],taillePixel):
- for r in range(taillePixel):
- pixel[i+r,j] = couleurFond1
- pixel[i,j+r] = couleurFond1
- image.save('output.png')
- def DessinerLignes2(self,im,taillePixel):
- global couleurFond1
- #---------------------------------
- image = Image.open(im)
- pixel = image.load()
- for i in range(0,image.size[0],taillePixel):
- for j in range(0,image.size[1],taillePixel):
- for r in range(taillePixel):
- try:
- pixel[i+r,j] = couleurFond1
- pixel[i,j+r] = couleurFond1
- except:
- pass
- image.save('output2.png')
- def RedimensionnerImage(self,im):
- #im.show()
- tailletemp = im.size
- print tailletemp
- BS = TailleBordure.get()
- FW = LargeurTissu.get()-BS
- FH = HauteurTissu.get()-BS
- print("FW={0},FH={1}".format(FW,FH))
- TaillePoints = ComboTaillePoints.get()
- MaxLPoint = (FW*TaillePoints)/tailletemp[0]
- MaxHPoint = (FH*TaillePoints)/tailletemp[1]
- print("MSW={0},MSH={1}".format(MaxLPoint,MaxHPoint))
- NouvelleHauteurImage = MaxHPoint * tailletemp[1]
- NouvelleLargeurImage = MaxLPoint * tailletemp[0]
- print("NIW={0},NIH={1}".format(NouvelleLargeurImage,NouvelleHauteurImage))
- nouvelleImage = im.resize((int(NouvelleLargeurImage),int(NouvelleHauteurImage)),Image.NEAREST)
- nouvelleImage.save('temp.jpg')
- return nouvelleImage
- def ChoixTaillePoints(self,p):
- selection = ComboTaillePoints.get()
- print selection
- def ChoixTailleAida(self,p):
- selection = ComboTaille.get()
- print selection
- if selection != "30":
- pos = selection.find("x")
- largeur = int(selection[:pos])
- hauteur=int(selection[pos+1:])
- print("W={0},H={1}".format(largeur,hauteur))
- else:
- largeur = 30
- hauteur = 30
- LargeurTissu.set(largeur)
- HauteurTissu.set(hauteur)
- def rgb2hex(self,rgb):
- return '#%02x%02x%02x' % rgb
- def RemplirListeDeroulante(self,nomFic):
- im = Image.open(nomFic)
- nbCouleurs = im.getcolors()
- couleurs = len(nbCouleurs)
- cntr = 1
- for c in nbCouleurs:
- hexcolor = self.rgb2hex(c[1])
- lblCouleur=Label(self.sfFrame,text=" ",bg=hexcolor,relief=GROOVE)
- lblCouleur.grid(row = cntr, column = 0, sticky = 'nsew',padx=10,pady=5)
- pkID = self.TrouverMeilleureDistance(c[1][0],c[1][1],c[1][2])
- sql = "SELECT * FROM DMC WHERE pkID = {0}".format(pkID)
- rset = curseur.execute(sql)
- for r in rset:
- hexcolor2 = r[6]
- dmcnum = r[1]
- nomCouleur = r[2]
- lblCouleur2=Label(self.sfFrame,text=" ",bg="#" + hexcolor2,relief=GROOVE)
- lblCouleur2.grid(row = cntr,column = 1,sticky = 'w',padx=5,pady=5)
- lblCouleur3=Label(self.sfFrame,text = str(dmcnum) + "-" + nomCouleur,justify=LEFT)
- CouleurDMC.set(dmcnum)
- lblCouleur3.grid(row = cntr, column = 2,sticky = "w",padx=1,pady=5)
- cntr += 1
- def OuvrirBase(self):
- global connexion
- global curseur
- #---------------------------------
- connexion = apsw.Connection("floss.db3")
- curseur = connexion.cursor()
- def TrouverMeilleureDistance(self,r1,g1,b1):
- # dist = math.sqrt(((r1-r2)**2) + ((g1-g2)**2) + ((b1-b2)**2))
- sql = "SELECT * FROM DMC"
- rset = curseur.execute(sql)
- BestDist = 10000.0
- for r in rset:
- pkID = r[0]
- r2 = r[3]
- g2 = r[4]
- b2 = r[5]
- dist = math.sqrt(((r1-r2)**2) + ((g1-g2)**2) + ((b1-b2)**2))
- if dist < BestDist:
- BestDist = dist
- BestpkID = pkID
- return BestpkID
- def AfficherMasquerGrille(self):
- global AfficherGrille
- #---------------------------------
- if AfficherGrille == False:
- self.btnAfficherGrille['text'] = 'Masquer grille'
- AfficherGrille = True
- self.im2=Image.open(self.GrilleImage)
- self.im2.thumbnail((500,500))
- self.img3 = ImageTk.PhotoImage(self.im2)
- self.lblImageR['image'] = self.img3
- else:
- self.btnAfficherGrille['text'] = 'Afficher grille'
- AfficherGrille = False
- self.im2=Image.open(self.ImageTraitee)
- self.im2.thumbnail((500,500))
- self.img3 = ImageTk.PhotoImage(self.im2)
- self.lblImageR['image'] = self.img3
- def SauverFichier(self):
- tkMessageBox.showinfo(title="Sauver fichier",message='Desole, la fonction sauvegarde est encore inexistante.')
- def AfficherAide(self):
- tkMessageBox.showinfo(title="Aide",message='Desole, la fonction aide est encore inexistante.')
- def AfficherApropos(self):
- tkMessageBox.showinfo(title="About",message='Desole, la fonction a propos est encore inexistante.')
- def Quitter(self):
- sys.exit()
- racine = Tk()
- racine.title("Generateur de motifs de point de croix")
- test = XStitch(racine)
- racine.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement