Advertisement
Guest User

FCM87-Python 56-GenerateurMotifsPointDeCroix

a guest
Jan 2nd, 2015
309
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 20.43 KB | None | 0 0
  1. #======================================================    
  2. #  Generateur de motifs de point de croix
  3. #  gmpc.py
  4. #  Ecrit par G.D. Walters
  5. #  Cree pour Full Circle Magazine numeros 85, 86, 87, 88
  6. #======================================================    
  7. from Tkinter import *
  8. import tkFileDialog
  9. import tkCommonDialog
  10. import tkMessageBox
  11. import ttk
  12. from PIL import Image,ImageTk,ImageOps
  13. import Pmw
  14. import apsw  # acces a la base de donnees
  15. import math  # bibliotheque mathematique
  16. import sys
  17.  
  18. class XStitch:
  19.     def __init__(self, principal):
  20.         self.formatsImages = [
  21.         ('JPEG / JFIF','*.jpg'),
  22.         ('Portable Network Graphics','*.png'),
  23.         ('CompuServer GIF','*.gif'),
  24.         ('Windows Bitmap','*.bmp'),
  25.         ('Tous les types *.*','*.*'),
  26.         ]
  27.  
  28.         self.openimage = PhotoImage(file='open.gif')
  29.         self.DefaultImage =ImageTk.PhotoImage(self.Apercu("default.jpg",450,450))
  30.         #-------------------------------------------
  31.         #            Definitions globales
  32.         #-------------------------------------------
  33.         #          pour l'interface graphique
  34.         global NomFichierOriginal
  35.         NomFichierOriginal = StringVar()
  36.         global NombreCouleursOriginal
  37.         NombreCouleursOriginal = StringVar()
  38.         global TailleOriginal
  39.         TailleOriginal = StringVar()
  40.     global ImageOriginale
  41.     ImageOriginale = StringVar()
  42.         global ComboTaillePoints
  43.         ComboTaillePoints = IntVar()
  44.         global ComboTaille
  45.         ComboTaille = StringVar()
  46.         global LargeurTissu
  47.         LargeurTissu = DoubleVar()
  48.         global HauteurTissu
  49.         HauteurTissu = DoubleVar()
  50.         global MaxCouleurs
  51.         MaxCouleurs = IntVar()
  52.         global TailleBordure
  53.         TailleBordure = DoubleVar()
  54.         global CouleursTraitees
  55.         CouleursTraitees = StringVar()
  56.         global TailleTraitee
  57.         TailleTraitee = StringVar()
  58.         global CouleurDMC
  59.         CouleurDMC = StringVar()
  60.         #-------------------------------------------
  61.         global AfficherGrille
  62.         AfficherGrille = True
  63.         global ImageTraitee
  64.         ImageTraitee = ""
  65.         global GrilleImage
  66.         GrilleImage = ""
  67.         global couleurFond1
  68.         couleurFond1 = (120,)*3
  69.         global couleurFond2
  70.         couleurFond2 = (0,)*3
  71.         global PretPourTraitement
  72.         PretPourTraitement = False
  73.         #-------------------------
  74.         self.OuvrirBase()
  75.         self.FabriquerMenu(principal)
  76.         frm = self.ConstruireWidgets(principal)
  77.         self.PlacerWidgets(frm)
  78.        
  79. #======================================================        
  80. #               DEBUT DEFINITION INTERFACE
  81. #======================================================
  82.     def FabriquerMenu(self,principal):
  83.         menu = Menu(principal)
  84.         racine.config(menu=menu)
  85.         menuFichier = Menu(menu, tearoff=0)
  86.         Traitement = Menu(menu,tearoff=0)
  87.         Aide = Menu(menu,tearoff=0)
  88.         #-------------------------------------------
  89.         #              Menu Fichier
  90.         #-------------------------------------------
  91.         menu.add_cascade(label="Fichier", menu=menuFichier)
  92.         menu.add_cascade(label="Traitement",menu=Traitement)
  93.         menu.add_cascade(label="Aide",menu=Aide)
  94.         menuFichier.add_command(label="Nouveau")
  95.         menuFichier.add_command(label="Ouvrir", command=self.RecupererNomFichier)
  96.         menuFichier.add_command(label="Sauver", command=self.SauverFichier)
  97.         menuFichier.add_separator()
  98.         menuFichier.add_command(label="Quitter", command=self.Quitter)
  99.         #-------------------------------------------
  100.         #               Menu Traitement
  101.         #-------------------------------------------
  102.         Traitement.add_command(label="Tous",command=self.Traitement1)
  103.         #-------------------------------------------
  104.         #                Menu Aide
  105.         #-------------------------------------------
  106.         Aide.add_command(label="Aide",command=self.AfficherAide)
  107.         Aide.add_separator()
  108.         Aide.add_command(label="A propos",command=self.AfficherApropos)
  109.        
  110.     def ConstruireWidgets(self,principal):
  111.         self.frame = Frame(principal,width=1024,height=850)
  112.         # ---------------- FENETRE HAUT ---------------------
  113.         self.frm1 = Frame(self.frame,width=1024,height=100,bd=4,relief=GROOVE)
  114.         self.label1 = Label(self.frm1,text = "Fichier original : ")
  115.         self.entNomFic = Entry(self.frm1,width=50,textvariable=NomFichierOriginal)
  116.         self.btnNomFic = Button(self.frm1,width=28,image=self.openimage,command=self.RecupererNomFichier)
  117.         self.label2 = Label(self.frm1,text = "Nb couleurs de l'original : ")
  118.         self.lblNombreCouleursOriginal = Label(self.frm1,text="",width=10,textvariable=NombreCouleursOriginal)
  119.         self.label3 = Label(self.frm1,text = "Taille de l'original : ")
  120.         self.lblTailleOriginal = Label(self.frm1,text="",width=10,textvariable=TailleOriginal)
  121.         # --------------- FENETRE MILIEU --------------------
  122.         self.frm2 = Frame(self.frame,width=1024,height=160,bd=4,relief=GROOVE)
  123.         self.lbl4 = Label(self.frm2,text="Taille des points de l'aida : ")
  124.         self.lbl5 = Label(self.frm2,text="Taille du tissu Aida : ")
  125.         self.TCombobox1 = ttk.Combobox(self.frm2,textvariable=ComboTaillePoints,width=8)
  126.         self.TCombobox1.bind('<<ComboboxSelected>>', self.ChoixTaillePoints)
  127.         self.TCombobox1['values'] = (7,10,11,12,14,16,18,22)
  128.         self.TCombobox2 = ttk.Combobox(self.frm2,textvariable=ComboTaille,width = 8)
  129.         self.TCombobox2.bind('<<ComboboxSelected>>',self.ChoixTailleAida)
  130.         self.TCombobox2['values'] = ("12x18","15x18","30")
  131.         self.lbl6 = Label(self.frm2,text="Nb max de couleurs : ")
  132.         self.entMaxCouleurs = Entry(self.frm2,textvariable=MaxCouleurs,width=3)
  133.         self.lbl7 = Label(self.frm2,text="Taille bordure : ")
  134.         self.entTailleBordure = Entry(self.frm2,textvariable=TailleBordure,width = 8)
  135.         self.frmLine = Frame(self.frm2,width=6,height=80,bd=3,relief="raised")
  136.         self.lbl8 = Label(self.frm2,text="Couleurs traitees : ")
  137.         self.lbl9 = Label(self.frm2,text="Nb points traites : ")
  138.         self.lblCouleursTraitees=Label(self.frm2,width=10,textvariable=CouleursTraitees,justify=LEFT)
  139.         self.lblTailleTraitee=Label(self.frm2,width=10,textvariable=TailleTraitee,justify=LEFT)
  140.         self.btnDoIt = Button(self.frm2,text="Traitement",width=11,command = self.Traitement1)
  141.         self.btnAfficherGrille = Button(self.frm2,text="Masquer grille",width=11,command=self.AfficherMasquerGrille)
  142.         ComboTaillePoints.set(14)
  143.         ComboTaille.set("15x18")
  144.         LargeurTissu.set(15)
  145.         HauteurTissu.set(18)
  146.         MaxCouleurs.set(50)
  147.         TailleBordure.set(1.0)        
  148.         # --------------- FENETRE BAS -----------------------
  149.         self.frm3 = Frame(self.frame,width=1024,height=768,bd=4,relief=GROOVE)
  150.         self.lblImageL = Label(self.frm3,image=self.DefaultImage,height=500,width=500,borderwidth=2,relief=GROOVE,textvariable=ImageOriginale)
  151.         self.lblImageR = Label(self.frm3,image=self.DefaultImage,height=500,width=500,borderwidth=2,relief=GROOVE)
  152.         #---------------- FENETRE COTE ----------------------
  153.         self.frm4 = Frame(self.frame,width = 300,height=610,bd=4,relief=GROOVE)
  154.         self.lbl20 = Label(self.frm4,text="Liste couleurs traitees",width = 50)
  155.         # Cree la fenetre deroulante
  156.         self.sf = Pmw.ScrolledFrame(self.frm4,
  157.                 labelpos = 'n', label_text = 'Liste couleurs traitees',
  158.                 usehullsize = 1,
  159.                 hull_width = 300,
  160.                 hull_height = 590,
  161.                 )
  162.         return self.frame
  163.        
  164.     def PlacerWidgets(self,fenetre):
  165.         fenetre.grid(column = 0, row = 0)
  166.         # ---------------- FENETRE HAUT ---------------------
  167.         self.frm1.grid(column=0,row=0,rowspan=2,sticky="new")
  168.         self.label1.grid(column=0,row=0,sticky='w')
  169.         self.entNomFic.grid(column=1,row=0,sticky='w',columnspan = 5)
  170.         self.btnNomFic.grid(column=7,row = 0,sticky='w')
  171.         self.label2.grid(column=9,row=0,sticky='w',padx=10)
  172.         self.lblNombreCouleursOriginal.grid(column=10,row=0,sticky='w')
  173.         self.label3.grid(column=9,row=1,sticky='w',padx=10,pady=5)
  174.         self.lblTailleOriginal.grid(column=10,row=1,sticky='w')
  175.         # ---------------- FENETRE MILIEU -------------------
  176.         self.frm2.grid(column=0,row=2,rowspan=2,sticky="new")
  177.         self.lbl4.grid(column=0,row=0,sticky="new",pady=5)
  178.         self.lbl5.grid(column=0,row=1,sticky="new")
  179.         self.TCombobox1.grid(column=1,row=0,sticky="new",pady=5)
  180.         self.TCombobox2.grid(column=1,row=1,sticky="new")
  181.         self.lbl6.grid(column=2,row = 0,sticky="new",padx=5,pady=5)
  182.         self.entMaxCouleurs.grid(column=3,row=0,sticky="new",pady=5)
  183.         self.lbl7.grid(column=2,row=1,sticky='new',padx=5)
  184.         self.entTailleBordure.grid(column=3,row=1,sticky='new')
  185.         self.frmLine.grid(column=4,row=0,rowspan=2,sticky='new',padx=15)
  186.         self.lbl8.grid(column=5,row=0,sticky='new',pady=5)
  187.         self.lbl9.grid(column=5,row=1,sticky='new',pady=5)
  188.         self.lblCouleursTraitees.grid(column=6,row=0,sticky='w',pady=5)
  189.         self.lblTailleTraitee.grid(column=6,row=1,sticky='new',pady=5)
  190.         self.btnDoIt.grid(column=7,row=0,sticky='e',padx=5,pady = 5)
  191.         self.btnAfficherGrille.grid(column=7,row=1,sticky='e',padx=5,pady = 5)
  192.         # ---------------- FENETRE BAS ----------------------
  193.         self.frm3.grid(column=0,row=4,sticky="nsew")
  194.         self.lblImageL.grid(column=0,row=0,sticky="w")
  195.         self.lblImageR.grid(column=1,row=0,sticky="e")
  196.         # ---------------- FENETRE COTE ---------------------
  197.         self.frm4.grid(column=2,row=0,rowspan=12,sticky="new")
  198.     #self.lbl20.grid(column=0,row=0,columnspan=2,sticky='ewn')
  199.         self.sf.grid(column=0,row=1)
  200.         self.sfFrame = self.sf.interior()
  201.         self.lblch1 = Label(self.sfFrame,text="    Original")
  202.         self.lblch2 = Label(self.sfFrame,text="    DMC")
  203.         self.lblch3 = Label(self.sfFrame,text="Nom/Numero")
  204.         self.lblch1.grid(column=0,row=0,sticky='w')
  205.         self.lblch2.grid(column=1,row=0,sticky='w')
  206.         self.lblch3.grid(column=2,row=0,sticky="w")
  207. #======================================================
  208. #               FIN DEFINITION INTERFACE
  209. #======================================================    
  210.  
  211.        
  212.     def RecupererNomFichier(self):
  213.         global PretPourTraitement
  214.         #---------------------------------        
  215.         NomFic = tkFileDialog.askopenfilename(parent=racine,filetypes=self.formatsImages ,title="Choisir le fichier a ouvrir...")
  216.         print NomFic
  217.         NomFichierOriginal.set(NomFic)
  218.         NombreCouleursOriginal.set(self.RecupererNbCouleurs(NomFic))
  219.         TailleOriginal.set(self.RecupererHauteurLargeur(NomFic))
  220.         imageMaitresse=Image.open(NomFic)
  221.         imageMaitresse.thumbnail((500,500))
  222.         self.img = ImageTk.PhotoImage(imageMaitresse)
  223.         self.lblImageL['image'] = self.img
  224.         PretPourTraitement = True
  225.        
  226.     def Apercu(self,fichier,tailleH,tailleV):
  227.         taille = tailleH,tailleV
  228.         posExt = fichier.rfind(".")
  229.         fichierSortie = fichier[:posExt] + ".thumbnail"
  230.         im = Image.open(fichier)
  231.         im.thumbnail(taille)
  232.         im.save(fichierSortie,"JPEG")
  233.         return im
  234.        
  235.     def InfoOriginal(self,fichier):
  236.         im = Image.open(fichier)
  237.         imFormat = im.format
  238.         imTaille = im.size
  239.         imMode = im.mode
  240.  
  241.         self.taille = imTaille
  242.         self.imformat = imFormat
  243.         self.immode = imMode
  244.    
  245.     def RecupererNbCouleurs(self,fichier):
  246.         im = Image.open(fichier)
  247.         nbCouleurs = im.getcolors(1600000)
  248.         self.couleurs = len(nbCouleurs)    
  249.         print self.couleurs        
  250.         return self.couleurs
  251.        
  252.     def RecupererHauteurLargeur(self,fichier):
  253.         im = Image.open(fichier)
  254.         tmp = "{0}x{1}".format(im.size[0],im.size[1])
  255.         print tmp
  256.         return tmp
  257.  
  258.     def RecupererHauteurLargeur2(self,fichier):
  259.         im = Image.open(fichier)
  260.         return im.size[0],im.size[1]
  261.        
  262.     def RecupererCouleurs(self,image):
  263.         nbCouleurs = image.getcolors(1600000)
  264.         couleurs = len(nbCouleurs)    
  265.         print couleurs
  266.                    
  267.     def Traitement1(self):
  268.         #---------------------------------
  269.         # Reduire couleurs
  270.         # Redimensionner image
  271.         # Placer image dans bon label
  272.         global PretPourTraitement
  273.         #---------------------------------        
  274.         if PretPourTraitement == False:
  275.             tkMessageBox.showinfo(title="ERREUR...",message='Vous devez charger une image originale.')
  276.         else:
  277.             nouvelleImage = self.Pixeliser(NomFichierOriginal.get(),5)
  278.             Reduite = self.ReduireCouleurs(nouvelleImage)
  279.             L,H = self.RecupererHauteurLargeur2(Reduite)
  280.             tail = "{0}x{1}".format(L/5,H/5)
  281.             TailleTraitee.set(tail)
  282.             # Placer image
  283.             self.im2=Image.open(Reduite)
  284.             self.im2.thumbnail((500,500))
  285.             self.img3 = ImageTk.PhotoImage(self.im2)
  286.             self.lblImageR['image'] = self.img3
  287.             self.ImageTraitee = 'im1.png'
  288.             self.DessinerLignes(Reduite,5)
  289.             self.DessinerLignes2('output.png',50)
  290.             self.im2 = Image.open('output2.png')
  291.             self.im2.thumbnail((500,500))
  292.             self.img3 = ImageTk.PhotoImage(self.im2)
  293.             self.lblImageR['image'] = self.img3
  294.             self.RemplirListeDeroulante('output.png')
  295.             self.GrilleImage = 'output2.png'
  296.  
  297.     def Pixeliser(self,im,taillePixel):
  298.         image = Image.open(im)
  299.         self.RecupererCouleurs(image)
  300.         image = image.resize((image.size[0]/taillePixel, image.size[1]/taillePixel),Image.NEAREST)
  301.         image = image.resize((image.size[0]*taillePixel, image.size[1]*taillePixel),Image.NEAREST)
  302.         self.RecupererCouleurs(image)
  303.         #image.show()
  304.         image.save('newimage.png')
  305.         return 'newimage.png'
  306.  
  307.     def ReduireCouleurs(self,NomImage):
  308.         #Reduire couleurs
  309.         nbCouleurs=MaxCouleurs.get()
  310.         print("NbCouleurs={0}".format(nbCouleurs))
  311.         image = Image.open(NomImage)
  312.         output = image.convert('P', palette=Image.ADAPTIVE, colors=nbCouleurs)
  313.         x = output.convert("RGB")
  314.         self.RecupererCouleurs(x)
  315.         nbCouleurs = x.getcolors()
  316.         CouleursTraitees.set(len(nbCouleurs))
  317.         for i in nbCouleurs:
  318.             print i        
  319.         x.save('im1.png')
  320.         return 'im1.png'
  321.  
  322.     def DessinerLignes(self,im,taillePixel):
  323.         global couleurFond1
  324.         #---------------------------------
  325.         image = Image.open(im)
  326.         pixel = image.load()
  327.         for i in range(0,image.size[0],taillePixel):
  328.             for j in range(0,image.size[1],taillePixel):
  329.                 for r in range(taillePixel):
  330.                     pixel[i+r,j] = couleurFond1
  331.                     pixel[i,j+r] = couleurFond1
  332.         image.save('output.png')
  333.            
  334.     def DessinerLignes2(self,im,taillePixel):
  335.         global couleurFond1
  336.         #---------------------------------
  337.         image = Image.open(im)
  338.         pixel = image.load()
  339.         for i in range(0,image.size[0],taillePixel):
  340.             for j in range(0,image.size[1],taillePixel):
  341.                 for r in range(taillePixel):
  342.                     try:
  343.                         pixel[i+r,j] = couleurFond1
  344.                         pixel[i,j+r] = couleurFond1
  345.                     except:
  346.                         pass
  347.         image.save('output2.png')
  348.                                
  349.     def RedimensionnerImage(self,im):
  350.         #im.show()
  351.         tailletemp = im.size
  352.         print tailletemp
  353.         BS = TailleBordure.get()
  354.         FW = LargeurTissu.get()-BS
  355.         FH = HauteurTissu.get()-BS
  356.         print("FW={0},FH={1}".format(FW,FH))
  357.         TaillePoints = ComboTaillePoints.get()
  358.         MaxLPoint = (FW*TaillePoints)/tailletemp[0]
  359.         MaxHPoint = (FH*TaillePoints)/tailletemp[1]
  360.         print("MSW={0},MSH={1}".format(MaxLPoint,MaxHPoint))
  361.         NouvelleHauteurImage = MaxHPoint * tailletemp[1]
  362.         NouvelleLargeurImage = MaxLPoint * tailletemp[0]
  363.         print("NIW={0},NIH={1}".format(NouvelleLargeurImage,NouvelleHauteurImage))
  364.         nouvelleImage = im.resize((int(NouvelleLargeurImage),int(NouvelleHauteurImage)),Image.NEAREST)
  365.         nouvelleImage.save('temp.jpg')                    
  366.         return nouvelleImage
  367.                        
  368.     def ChoixTaillePoints(self,p):
  369.         selection = ComboTaillePoints.get()
  370.         print selection
  371.        
  372.     def ChoixTailleAida(self,p):
  373.         selection = ComboTaille.get()
  374.         print selection
  375.         if selection != "30":
  376.             pos = selection.find("x")
  377.             largeur = int(selection[:pos])
  378.             hauteur=int(selection[pos+1:])
  379.             print("W={0},H={1}".format(largeur,hauteur))
  380.         else:
  381.             largeur = 30
  382.             hauteur = 30
  383.         LargeurTissu.set(largeur)
  384.         HauteurTissu.set(hauteur)
  385.  
  386.     def rgb2hex(self,rgb):
  387.         return '#%02x%02x%02x' % rgb
  388.        
  389.     def RemplirListeDeroulante(self,nomFic):
  390.         im = Image.open(nomFic)
  391.         nbCouleurs = im.getcolors()
  392.         couleurs = len(nbCouleurs)    
  393.         cntr = 1
  394.         for c in nbCouleurs:
  395.             hexcolor = self.rgb2hex(c[1])
  396.             lblCouleur=Label(self.sfFrame,text="                ",bg=hexcolor,relief=GROOVE)
  397.             lblCouleur.grid(row = cntr, column = 0, sticky = 'nsew',padx=10,pady=5)
  398.             pkID = self.TrouverMeilleureDistance(c[1][0],c[1][1],c[1][2])
  399.             sql = "SELECT * FROM DMC WHERE pkID = {0}".format(pkID)
  400.             rset = curseur.execute(sql)
  401.             for r in rset:
  402.                 hexcolor2 = r[6]
  403.                 dmcnum = r[1]
  404.                 nomCouleur = r[2]
  405.             lblCouleur2=Label(self.sfFrame,text="                ",bg="#" + hexcolor2,relief=GROOVE)
  406.             lblCouleur2.grid(row = cntr,column = 1,sticky = 'w',padx=5,pady=5)
  407.             lblCouleur3=Label(self.sfFrame,text = str(dmcnum) + "-" + nomCouleur,justify=LEFT)
  408.             CouleurDMC.set(dmcnum)
  409.             lblCouleur3.grid(row = cntr, column = 2,sticky = "w",padx=1,pady=5)
  410.             cntr += 1
  411.  
  412.     def OuvrirBase(self):
  413.         global connexion
  414.         global curseur
  415.         #---------------------------------        
  416.         connexion = apsw.Connection("floss.db3")
  417.         curseur = connexion.cursor()
  418.        
  419.     def TrouverMeilleureDistance(self,r1,g1,b1):
  420.         # dist = math.sqrt(((r1-r2)**2) + ((g1-g2)**2) + ((b1-b2)**2))
  421.         sql = "SELECT * FROM DMC"
  422.         rset = curseur.execute(sql)
  423.         BestDist = 10000.0
  424.         for r in rset:
  425.             pkID = r[0]
  426.             r2 = r[3]
  427.             g2 = r[4]
  428.             b2 = r[5]
  429.             dist = math.sqrt(((r1-r2)**2) + ((g1-g2)**2) + ((b1-b2)**2))
  430.             if dist < BestDist:
  431.                 BestDist = dist
  432.                 BestpkID = pkID
  433.         return BestpkID
  434.  
  435.     def AfficherMasquerGrille(self):
  436.         global AfficherGrille
  437.         #---------------------------------        
  438.         if AfficherGrille == False:
  439.             self.btnAfficherGrille['text'] = 'Masquer grille'
  440.             AfficherGrille = True
  441.             self.im2=Image.open(self.GrilleImage)
  442.             self.im2.thumbnail((500,500))
  443.             self.img3 = ImageTk.PhotoImage(self.im2)
  444.             self.lblImageR['image'] = self.img3            
  445.         else:
  446.             self.btnAfficherGrille['text'] = 'Afficher grille'
  447.             AfficherGrille = False
  448.             self.im2=Image.open(self.ImageTraitee)
  449.             self.im2.thumbnail((500,500))
  450.             self.img3 = ImageTk.PhotoImage(self.im2)
  451.             self.lblImageR['image'] = self.img3
  452.            
  453.     def SauverFichier(self):
  454.         tkMessageBox.showinfo(title="Sauver fichier",message='Desole, la fonction sauvegarde est encore inexistante.')
  455.  
  456.     def AfficherAide(self):
  457.         tkMessageBox.showinfo(title="Aide",message='Desole, la fonction aide est encore inexistante.')
  458.  
  459.     def AfficherApropos(self):
  460.         tkMessageBox.showinfo(title="About",message='Desole, la fonction a propos est encore inexistante.')
  461.  
  462.     def Quitter(self):
  463.         sys.exit()        
  464.  
  465. racine = Tk()
  466. racine.title("Generateur de motifs de point de croix")
  467. test = XStitch(racine)
  468. racine.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement