1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import sys, os, glob, string, Image, ImageFilter, ImageOps, ImageEnhance, ImageDraw
  5. from random import randrange
  6. from numpy import *
  7. from PyQt4.QtCore import *
  8. from PyQt4.QtGui import *
  9. # Module SpinSliders20Possibles rajouté le 16/07/10
  10. from gui_modules_image.image_base import Base, SpinSlider, SpinSliders, SpinSliders20Possibles
  11. from gui_modules_image.selectWidget import SelectWidget
  12. from gui_modules_lecture.lecture_image import Lecture_VisionImage
  13. from gui_modules_lecture.affichage_image.afficheurImage import VisionneurEvolue
  14.  
  15. # Gestion de la configuration via EkdConfig
  16. from moteur_modules_common.EkdConfig import EkdConfig
  17. # Nouvelle fenêtre d'aide
  18. from gui_modules_common.EkdWidgets import EkdAide
  19. # Nouvelle boite de dialogue pour sauver les fichiers
  20. from gui_modules_common.EkdWidgets import EkdSaveDialog
  21.  
  22. from moteur_modules_common.EkdProcess import EkdProcess
  23.  
  24. class FiltresAvec9Spin(QFrame):
  25. """Widget de réglage à 9 boites de spin"""
  26. def __init__(self, txt1='', txt2=None, parent=None):
  27. QFrame.__init__(self)
  28.  
  29. grid = QGridLayout(self)
  30. self.vColor = []
  31. self.spin = [[0]*3,[0]*3,[0]*3]
  32. for k in range(3):
  33. x = QLineEdit()
  34. x.setMinimumHeight(25)
  35. self.vColor.append(x)
  36. grid.addWidget(self.vColor[k], 1, k+1)
  37. for l in range(3):
  38. self.spin[k][l]=SpinSlider(0, 99, 50, 'couleur_'+str(k+1)+str(l+1), parent)
  39. self.connect(self.spin[k][l], SIGNAL("valueChanged(int)"), self.updateColor)
  40. grid.addWidget(self.spin[k][l], k+2, l+1)
  41. self.updateColor(50)
  42. grid.addWidget(QLabel(_(u"Couleur n°1")), 0, 1)
  43. grid.addWidget(QLabel(_(u"Couleur n°2")), 0, 2)
  44. grid.addWidget(QLabel(_(u"Couleur n°3")), 0, 3)
  45. grid.addWidget(QLabel(_(u"Rouge")), 2, 0)
  46. grid.addWidget(QLabel(_(u"Vert")), 3, 0)
  47. grid.addWidget(QLabel(_(u"Bleu")), 4, 0)
  48. grid.setAlignment(Qt.AlignCenter)
  49.  
  50. def updateColor(self, val) :
  51. for i in range(3) :
  52. bckcol=QPalette()
  53. bckcol.setColor(QPalette.Base,QColor(int(self.spin[0][i].value()*2.55),int(self.spin[1][i].value()*2.55),int(self.spin[2][i].value()*2.55)))
  54. #self.vColor[i].setBackgroundRole(QPalette.Base)
  55. self.vColor[i].setPalette(bckcol)
  56.  
  57.  
  58.  
  59.  
  60.  
  61. class FiltresAvec13Spin(QFrame):
  62. """Widget de réglage à 13 boites de spin"""
  63. def __init__(self, txt1='', txt2=None, parent=None):
  64. QFrame.__init__(self)
  65.  
  66. grid = QGridLayout(self)
  67. grid.addWidget(QLabel(_(u"Intensite du trait")), 0, 0)
  68. self.spinTrait = SpinSlider(10,40, 25, 'coul_contour_couleur_00', parent=parent)
  69. grid.addWidget(self.spinTrait, 0, 1, 1, -1)
  70. grid.addWidget(QLabel(_(u"Couleur du trait de contour")), 1, 0)
  71. # Ajout de self.spinTrait à la fin de la liste self.spin pour une meilleure
  72. # récupération de la valeur de l'intensité du trait dans les fonctions
  73. # visu_1ere_img et appliquerContourEtCouleur
  74. self.spin = [[0]*3,[0]*3,[0]*3,[0]*3,self.spinTrait]
  75. self.vColor = []
  76. colorTrait = QLineEdit()
  77. grid.addWidget(colorTrait, 1, 1, 1, -1)
  78. grid.addWidget(QLabel(_(u"Rouge")), 2, 0)
  79. grid.addWidget(QLabel(_(u"Vert")), 3, 0)
  80. grid.addWidget(QLabel(_(u"Bleu")), 4, 0)
  81. grid.addWidget(QLabel(_(u"Transparence")), 5, 0)
  82.  
  83. for p in range(4) :
  84. if p == 3 : coul = 255
  85. else : coul = 20
  86. self.spin[p][2]=SpinSlider(0, 255, coul, 'coul_contour_couleur_'+str(p+1)+'3', parent=parent)
  87. self.connect(self.spin[p][2], SIGNAL("valueChanged(int)"), self.updateColor)
  88. grid.addWidget(self.spin[p][2], p+2, 1, 1, -1)
  89.  
  90. for z in range(2) :
  91. x = QLineEdit()
  92. x.setMinimumHeight(25)
  93. self.vColor.append(x)
  94. grid.addWidget(self.vColor[z], 7, z+1)
  95.  
  96. self.vColor.append(colorTrait)
  97.  
  98. for k1 in range(4):
  99. for l1 in range(2):
  100. incrementation=str(k1)+'_'+str(l1)
  101. # -- Orange avec canal alpha opaque --
  102. if incrementation=='0_0': coul=92
  103. elif incrementation=='1_0': coul=125
  104. elif incrementation=='2_0': coul=188
  105. elif incrementation=='3_0': coul=255
  106. # -- Bleu avec canal alpha opaque ----
  107. elif incrementation=='0_1': coul=201
  108. elif incrementation=='1_1': coul=157
  109. elif incrementation=='2_1': coul=205
  110. elif incrementation=='3_1': coul=255
  111. self.spin[k1][l1]=SpinSlider(0, 255, coul, 'coul_contour_couleur_'+str(k1+1)+str(l1+1), parent)
  112. self.connect(self.spin[k1][l1], SIGNAL("valueChanged(int)"), self.updateColor)
  113. grid.addWidget(self.spin[k1][l1], k1+8, l1+1)
  114.  
  115.  
  116. self.updateColor(1)
  117. grid.addWidget(QLabel(_(u"Couleur pour l'ombre")), 6, 1)
  118. grid.addWidget(QLabel(_(u"Couleur pour la lumière")), 6, 2)
  119. grid.addWidget(QLabel(_(u"Rouge")), 8, 0)
  120. grid.addWidget(QLabel(_(u"Vert")), 9, 0)
  121. grid.addWidget(QLabel(_(u"Bleu")), 10, 0)
  122. grid.addWidget(QLabel(_(u"Transparence")), 11, 0)
  123. grid.setAlignment(Qt.AlignCenter)
  124.  
  125. def updateColor(self, val) :
  126. for i in range(3) :
  127. bckcol=QPalette()
  128. bckcol.setColor(QPalette.Base,QColor(self.spin[0][i].value(),self.spin[1][i].value(),self.spin[2][i].value(),self.spin[3][i].value()))
  129. self.vColor[i].setPalette(bckcol)
  130.  
  131.  
  132. class FiltresAvec8Spin(QFrame):
  133. """Widget de réglage à 6 boites de spin"""
  134. def __init__(self, txt1='', txt2=None, parent=None):
  135. QFrame.__init__(self)
  136.  
  137. grid = QGridLayout(self)
  138. self.spin = [[0]*2,[0]*2,[0]*2,[0]*2]
  139. self.vColor = []
  140. for z in range(2) :
  141. x = QLineEdit()
  142. x.setMinimumHeight(25)
  143. self.vColor.append(x)
  144. grid.addWidget(self.vColor[z], 1, z+1)
  145.  
  146. for k1 in range(4):
  147. for l1 in range(2):
  148. incrementation=str(k1)+'_'+str(l1)
  149. # -- Orange avec canal alpha opaque --
  150. if incrementation=='0_0': coul=253
  151. elif incrementation=='1_0': coul=145
  152. elif incrementation=='2_0': coul=5
  153. elif incrementation=='3_0': coul=255
  154. # -- Bleu avec canal alpha opaque ----
  155. elif incrementation=='0_1': coul=35
  156. elif incrementation=='1_1': coul=85
  157. elif incrementation=='2_1': coul=136
  158. elif incrementation=='3_1': coul=255
  159. self.spin[k1][l1]=SpinSlider(0, 255, coul, 'coul_omb_lum_a_la_coul_'+str(k1+1)+str(l1+1), parent)
  160. self.connect(self.spin[k1][l1], SIGNAL("valueChanged(int)"), self.updateColor)
  161. grid.addWidget(self.spin[k1][l1], k1+2, l1+1)
  162.  
  163. self.updateColor(1)
  164. grid.addWidget(QLabel(_(u"Couleur pour l'ombre")), 0, 1)
  165. grid.addWidget(QLabel(_(u"Couleur pour la lumière")), 0, 2)
  166. grid.addWidget(QLabel(_(u"Rouge")), 2, 0)
  167. grid.addWidget(QLabel(_(u"Vert")), 3, 0)
  168. grid.addWidget(QLabel(_(u"Bleu")), 4, 0)
  169. grid.addWidget(QLabel(_(u"Transparence")), 5, 0)
  170. grid.setAlignment(Qt.AlignCenter)
  171.  
  172. def updateColor(self, val) :
  173. for i in range(2) :
  174. bckcol=QPalette()
  175. bckcol.setColor(QPalette.Base,QColor(self.spin[0][i].value(),self.spin[1][i].value(),self.spin[2][i].value(),self.spin[3][i].value()))
  176. self.vColor[i].setPalette(bckcol)
  177.  
  178. ########Rajout le 7/04/2011 par LUCAS Thomas et CABANA Antoine##################
  179. class FiltreAvecFileDialog(QFrame):
  180. """..."""
  181. def __init__(self, txt1='', txt2=None, parent=None):
  182. QFrame.__init__(self)
  183. self.filename=QString('')
  184. hbox = QHBoxLayout(self)
  185. self.boutonDialogue = QPushButton("Ouvrir le fichier sur lequel ajouter l'effet",self)
  186. self.boutonDialogue.move(40, 50)
  187. self.connect(self.boutonDialogue,SIGNAL("clicked()"),self.ouvrirDialogue)
  188. hbox.addWidget(self.boutonDialogue)
  189.  
  190. def ouvrirDialogue(self):
  191. self.filename = QFileDialog.getOpenFileName(self, "Ouvrir un fichier","/home","Images (*.png *.gif *.jpg *.jpeg)")
  192. if self.filename:
  193. QMessageBox.information(self,"Fichier",self.trUtf8("Vous avez sélectionné :\n") + self.filename)
  194.  
  195. ################################################################################
  196.  
  197. class FiltresAvecCombo(QFrame):
  198. """Widget de réglage contenant une boite de combo"""
  199. def __init__(self, txt, liste, identifiant, parent):
  200. QFrame.__init__(self)
  201.  
  202. self.parent = parent
  203. self.identifiant = identifiant
  204.  
  205. hbox = QHBoxLayout(self)
  206. hbox.addWidget(QLabel(txt))
  207. self.combo = QComboBox()
  208.  
  209. font =QFont()
  210. fm = QFontMetricsF(font)
  211. hauteurIcone = fm.height() - 2 # icones espacées de 2 pixels
  212.  
  213. for i in liste:
  214. if len(i)!=3: self.combo.addItem(i[0],QVariant(i[1]))
  215. else:
  216. pixmap = QPixmap(hauteurIcone, hauteurIcone)
  217. color = QColor(i[2][0],i[2][1],i[2][2])
  218. pixmap.fill(color)
  219. self.combo.addItem(QIcon(pixmap),i[0],QVariant(i[1]))
  220. self.connect(self.combo, SIGNAL("currentIndexChanged(int)"), self.changerComboReglage)
  221. # Affiche l'entrée de la boite de combo inscrite dans un fichier de configuration
  222. parent.base.valeurComboIni(self.combo, parent.config, parent.idSection, identifiant)
  223. hbox.addWidget(self.combo)
  224. hbox.setAlignment(Qt.AlignCenter)
  225.  
  226. def changerComboReglage(self, i):
  227. self.parent.config.set(self.parent.idSection, self.identifiant,self.combo.itemData(i).toString())
  228.  
  229.  
  230. class Image_FiltresImage(QWidget):
  231. """# -----------------------------------
  232. # Cadre accueillant les widgets de :
  233. # Image >> Filtres image
  234. # -----------------------------------"""
  235. def __init__(self, statusBar, geometry):
  236.  
  237. QWidget.__init__(self)
  238.  
  239. # ----------------------------
  240. # Quelques paramètres de base
  241. # ----------------------------
  242.  
  243. # Gestion de la configuration via EkdConfig
  244. self.config=EkdConfig
  245. # Identifiant du cadre
  246. self.idSection = "image_filtres_image"
  247. self.base = Base()
  248. # Log du terminal
  249. self.base.printSection(self.idSection)
  250. # Fonction appelant la fenêtre principale
  251. self.mainWindowFrameGeometry = geometry
  252.  
  253. #=== Création des répertoires temporaires ===#
  254. # Gestion du repertoire tmp avec EkdConfig
  255. self.repTampon = EkdConfig.getTempDir() + os.sep + 'tampon' + os.sep + 'image_filtres_image' + os.sep
  256.  
  257. if os.path.isdir(self.repTampon) is False:
  258. os.makedirs(self.repTampon)
  259. if os.path.isdir(self.repTampon+'redim' + os.sep) is False:
  260. os.makedirs(self.repTampon+'redim' + os.sep)
  261.  
  262. # Scan du répertoire tampon /tmp/ekd/tampon/image_filtres_image
  263. listeRepTemp=glob.glob(self.repTampon+'*.*')
  264.  
  265. # Epuration/elimination des fichiers tampon contenus
  266. # dans /tmp/ekd/tampon/image_filtres_image
  267. if len(listeRepTemp)>0:
  268. for toutRepTempE in listeRepTemp:
  269. os.remove(toutRepTempE)
  270.  
  271. # Scan du répertoire tampon /tmp/ekd/tampon/conv_img_en_video/redim
  272. listeRepTempRedim=glob.glob(self.repTampon+'redim' + os.sep + '*.*')
  273.  
  274. # Epuration/elimination des fichiers tampon contenus
  275. # dans /tmp/ekd/tampon/conv_img_en_video/redim
  276. if len(listeRepTempRedim)>0:
  277. for toutRepTempE_Redim in listeRepTempRedim:
  278. os.remove(toutRepTempE_Redim)
  279.  
  280. #=== Variable contenant les titres du log ===#
  281. self.infosImgTitre = []
  282. txt = _(u"Image(s) chargée(s)")
  283. a='#'*36
  284. b = a + '\n# ' + txt + '\n' + a + '\n'
  285. txt=_(u"Image(s) convertie(s)")
  286. c = a + '\n# ' + txt + '\n' + a + '\n'
  287. self.infosImgTitre.append(b)
  288. self.infosImgTitre.append(c)
  289.  
  290. #=== Drapeaux ===#
  291. # Une conversion (même partielle) a-t-elle eu lieu après le chargement des images? (1: vrai)
  292.  
  293. # Est-ce que des images ont été converties et qu'elles n'ont pas encore été montrées?
  294. # Marche aussi quand la conversion a été arrêté avant la fin de la 1ère image
  295. self.conversionImg = 0
  296. # Est-ce que des images sources ont été modifiées? (c'est-à-dire ajoutées ou supprimées)
  297. self.modifImageSource = 0
  298.  
  299. # Identifiant des filtres utilisant partiellement ou intégralement un module python durant la conversion
  300. self.filtresPython=['illustration_niveau_gris','traits_fins&couleur','emboss','sharpen','niveau_gris','couleurs_personnalisees','vieux_films','couleurs_predefinies', 'amelior_des_bords', 'debruitage', 'seuillage', 'evanescence', 'imitation_bd_1', 'negatif', 'encadre_photo', 'separ_en_modules', 'omb_lum_a_la_coul', 'rotation_image', 'imitation_bd_2', 'laplacien_1', 'contour_et_couleur']
  301.  
  302. # Fonctions communes à plusieurs cadres du module Image
  303. # Paramètres de configuration
  304. self.listeImgSource = []
  305. self.listeImgDestin = []
  306.  
  307. self.process = QProcess()
  308. self.connect(self.process, SIGNAL('finished(int)'), self.finConversion)
  309.  
  310. # Boite d'alignement vertical
  311. vbox=QVBoxLayout(self)
  312.  
  313. self.tabwidget=QTabWidget()
  314.  
  315. #------------------
  316. # Onglet Réglages
  317. #------------------
  318.  
  319. self.framReglage=QFrame()
  320. vboxReglage=QVBoxLayout(self.framReglage)
  321.  
  322. #=== Stacked ===#
  323.  
  324. self.stacked = QStackedWidget()
  325. self.stacked.setSizePolicy(QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Fixed))
  326.  
  327. #=== Instanciation des widgets du stacked ===#
  328.  
  329. # Widgets du stacked sans réglage
  330. stacked_sansReglage = QFrame()
  331. vboxStacked = QVBoxLayout(stacked_sansReglage)
  332. txt=_(u"Pas de réglages ici")
  333. vboxStacked.addWidget(QLabel("<center>%s</center>" %txt))
  334.  
  335. # Widgets du stacked avec un combo
  336. liste = [ (_(u"Impulse"), "impulse"),\
  337. (_(u"Laplacian"), "laplacian"),\
  338. (_(u"Poisson"), "poisson")]
  339. stacked_pointillisme = FiltresAvecCombo(_(u"Sélection des couleurs"), liste, 'pointillisme', self)
  340. liste = [ (_(u"Rouge vif"), "rouge_vif", (198,0,0)),\
  341. (_(u"Rouge primaire"), "rouge_primaire", (199,0,101)),\
  342. (_(u"Vert perroquet"), "vert_perroquet", (0,199,0)),\
  343. (_(u"Vert acide et clair"), "vert_acide_clair", (146,198,1)),\
  344. (_(u"Bleu roi"), "bleu_roi", (0,145,254)),\
  345. (_(u"Bleu indigo"), "bleu_indigo", (145,145,255)),\
  346. (_(u"Bleu turquoise"), "bleu_turquoise", (145,255,255)),\
  347. (_(u"Jaune or"), "jaune_or", (234,198,0)),\
  348. (_(u"Jaune orange"), "jaune_orange", (255,197,0)),\
  349. (_(u"Saumon"), "saumon", (234,163,145)),\
  350. (_(u"Marron très clair"), "marron_tres_clair", (205,158,116)),\
  351. (_(u"Terre argileuse"), "terre argileuse", (243,159,123)),\
  352. (_(u"Gris colore rouge"), "gris_colore_rouge", (220,162,161)),\
  353. (_(u"Gris colore vert"), "gris_colore_vert", (162,200,161)),\
  354. (_(u"Gris colore bleu"), "gris_colore_bleu", (161,162,206)),\
  355. (_(u"Gris colore jaune"), "gris_colore_jaune", (200,200,162))]
  356. stacked_couleursPredef = FiltresAvecCombo(_(u"Type"), liste, 'couleurs_predefinies', self)
  357. liste = [ (_(u"Fond blanc, lignes noires"), "fond_blanc_lignes_noires"),\
  358. (_(u"Fond noir, lignes blanches"), "fond_noir_lignes_blanches")]
  359. stacked_evanescence = FiltresAvecCombo(_(u"Fond, forme"), liste, 'evanescence', self)
  360. liste = [ (_(u"Négatif couleur"), "negatif_couleur"),\
  361. (_(u"Négatif noir et blanc"), "negatif_n_et_b")]
  362. stacked_negatif = FiltresAvecCombo(_(u"Type de négatif"), liste, 'negatif', self)
  363. liste = [ (_(u"90 degrés vers la gauche"), 'rot_img_90_gauche'),\
  364. (_(u"180 degrés vers la gauche"), 'rot_img_180_gauche'),\
  365. (_(u"270 degrés vers la gauche"), 'rot_img_270_gauche')]
  366. stacked_retournement_img = FiltresAvecCombo(_(u"Type de rotation"), liste, 'rotation_image', self)
  367. liste = [ (_(u"Noir et blanc"), 'laplacien_1_noir_et_blanc'),\
  368. (_(u"Couleur"), 'laplacien_1_couleur')]
  369. stacked_laplacien_1 = FiltresAvecCombo(_(u"Type"), liste, 'laplacien_1', self)
  370.  
  371.  
  372. # Widgets du stacked avec un ou plusieurs combos et boite(s) de spin
  373. liste = [ (_(u"Noir"), "noir"),\
  374. (_(u"Gris"), "gris"),\
  375. (_(u"Blanc"), "blanc"),\
  376. (_(u"Rouge"), "rouge"),\
  377. (_(u"Vert"), "vert"),\
  378. (_(u"Bleu"), "bleu"),\
  379. (_(u"Jaune"), "jaune")]
  380. stacked_encadrePhoto = FiltresAvecCombo(_(u"Couleur du cadre"), liste, 'encadre_photo', self)
  381.  
  382. # Widgets du stacked avec une seule boite de spin
  383. stacked_sepia = SpinSliders(self, 50,99,60,_(u"% de sepia"), 'sepia')
  384. stacked_traitsNoirs = SpinSliders(self, 1,70,1,_(u"valeur de charcoal"), 'charcoal_traits_noirs')
  385. stacked_peuCouleurs = SpinSliders(self, 30,90,40, _(u"valeur de edge"), 'edge')
  386. stacked_peintHuile = SpinSliders(self, 1,20,1, _(u"valeur de la peinture à l'huile"), 'peinture_huile')
  387. stacked_gamma = SpinSliders(self, 0,20,1, _(u"valeur de gamma"), 'gamma')
  388. stacked_fonceClair = SpinSliders(self, 1,400,100, _(u"1: Noir; 100: Normal; 400: Surexposé"), 'fonce_clair')
  389. stacked_peintEau = SpinSliders(self, 4,16,6, _(u"valeur de la liquidité"), 'liquidite')
  390. stacked_basRelief = SpinSliders(self, 1,16,1, _(u"Netteté du bas-relief"), 'bas_relief')
  391. # ----------------------------------------------------------------------
  392. # Géré par G'MIC
  393. stacked_dessin_13_coul = SpinSliders(self, 1,7000,1874, _(u"Amplitude"), 'dessin_13_amplitude')
  394. # ----------------------------------------------------------------------
  395. # Géré par G'MIC
  396. stacked_dessin_14_crayPapier_2 = SpinSliders(self, 1,50,3, _(u"Taille"), 'dessin_14_taille')
  397. # ----------------------------------------------------------------------
  398.  
  399. # Widgets du stacked avec 2 boites de spin
  400. stacked_crayonPapier_1 = SpinSliders(self,
  401. 1,70,1, _(u"valeur de charcoal"),'charcoal_crayon_1',
  402. 1,10,1, _(u"valeur de spread"), 'spread_crayon_1')
  403. stacked_blur = SpinSliders(self,
  404. 1,16,1, _(u"radius"), 'radius',
  405. 1,16,1, _("sigma"), 'sigma')
  406. stacked_traitCoulFond = SpinSliders(self,
  407. 1,20,1, _(u"précision du trait (1: Net; 20: Flou)"), 'precision_trait',
  408. 1,20,1, _(u"largeur du trait (1 : Fin; 20 : Gras)"), 'largeur_trait')
  409. stacked_seuillage = SpinSliders(self,
  410. 1,255,1, _(u"seuillage bas"), 'seuillage_bas',
  411. 1,255,128, _(u"seuillage haut"), 'seuillage_haut')
  412. stacked_imitationBd_2 = SpinSliders(self,
  413. 10,40,28, _(u"intensité du trait"), 'intensite_du_trait_bd_2',
  414. 2,16,4, _(u"flou des couleurs"), 'flou_couleurs')
  415. # ----------------------------------------------------------------------
  416. # Géré par G'MIC
  417. ########Rajout le 28/11/2010 par LUCAS Thomas et CABANA Antoine#########
  418. stacked_visionThermique = SpinSliders(self,
  419. 1,255,1, _(u"Minimum de luminance"), 'vision_thermique_min',
  420. 1,255,255, _(u"Maximum de luminance"), 'vision_thermique_max')
  421. ########################################################################
  422. # ----------------------------------------------------------------------
  423.  
  424. # Widgets du stacked avec 3 boites de spin
  425. stacked_imitationBd_1 = SpinSliders(self,
  426. 10,40,28, _(u"intensité du trait"), 'intensite_du_trait_bd_1',
  427. 1,4,2, _(u"réduction des couleurs"), 'reduction_couleur',
  428. 1,8,6, _(u"contraste des couleurs"), 'contraste_couleur')
  429. # ----------------------------------------------------------------------
  430. # Géré par G'MIC
  431. stacked_cubismeAnalytique = SpinSliders(self,
  432. 1,1000,240, _(u"Itérations"), 'iterations_cubisme_analytique',
  433. 1,100,8, _(u"Taille de bloc"), 'taille_bloc_cubisme_analytique',
  434. 1,360,114, _(u"Angle"), 'angle_cubisme_analytique')
  435. # ----------------------------------------------------------------------
  436. # Géré par G'MIC
  437. stacked_correctionYeuxRouges = SpinSliders(self,
  438. 1,100,80, _(u"Seuil des couleurs"), 'seuil_coul_correct_yeux_rouges',
  439. 1,100,1, _(u"Lissage"), 'lissage_correct_yeux_rouges',
  440. 1,100,1, _(u"Atténuation"), 'attenuation_correct_yeux_rouges')
  441. # ----------------------------------------------------------------------
  442. # Géré par G'MIC
  443. stacked_expressionnisme = SpinSliders(self,
  444. 1,10,2, _(u"Abstraction"), 'abstraction_expressionnisme',
  445. 1,500,180, _(u"Lissage"), 'lissage_expressionnisme',
  446. 1,400,340, _(u"Couleur"), 'couleur_expressionnisme')
  447. # ----------------------------------------------------------------------
  448. # Géré par G'MIC
  449. stacked_vieille_photo = SpinSliders(self,
  450. 1,10,4, _(u"Taille en largeur de l'ombre"), 'taill_larg_ombre_vieil_photo',
  451. 1,10,4, _(u"Taille en hauteur de l'ombre"), 'taill_haut_ombre_vieil_photo',
  452. 1,90,10, _(u"Rotation (en degrés) de la photo"), 'rot_photo_vieil_photo')
  453. # ----------------------------------------------------------------------
  454.  
  455. # Widgets du stacked avec 20 boites de spin possibles (classe SpinSliders20Possibles de gui_modules_image.image_base)
  456. # ----------------------------------------------------------------------
  457. # Géré par G'MIC
  458. stacked_polaroid = SpinSliders20Possibles(self,
  459. 5,50,10, _(u"Taille de la bordure"), 'taill_bord_polaroid',
  460. 1,10,4, _(u"Taille en largeur de l'ombre"), 'taill_larg_ombre_polaroid',
  461. 1,10,4, _(u"Taille en hauteur de l'ombre"), 'taill_haut_ombre_polaroid',
  462. 1,90,10, _(u"Rotation (en degrés) de la photo"), 'rot_photo_polaroid')
  463. # ----------------------------------------------------------------------
  464. # Géré par G'MIC
  465. stacked_oeilleton = SpinSliders20Possibles(self,
  466. 1,100,50, _(u"Position sur la largeur"), 'pos_larg_oeilleton',
  467. 1,100,50, _(u"Position sur la hauteur"), 'pos_haut_oeilleton',
  468. 1,100,50, _(u"Rayon"), 'rayon_oeilleton',
  469. 1,10,1, _(u"Amplitude"), 'amplitude_oeilleton')
  470. # ----------------------------------------------------------------------
  471. # Géré par G'MIC
  472. stacked_andyWarhol = SpinSliders20Possibles(self,
  473. 1,20,3, _(u"Nombre d'images par ligne"), 'nbre_img_ligne_andy_warhol',
  474. 1,20,3, _(u"Nombre d'images par colonne"), 'nbre_img_colonne_andy_warhol',
  475. 1,10,1, _(u"Lissage"), 'lissage_andy_warhol',
  476. 1,256,40, _(u"Couleur"), 'couleur_andy_warhol')
  477. # ----------------------------------------------------------------------
  478. # Géré par G'MIC
  479. stacked_bull_en_tableau = SpinSliders20Possibles(self,
  480. 100,2048,1024, _(u"Résolution en X"), 'resol_x_bull_en_tableau',
  481. 100,2048,1024, _(u"Résolution en Y"), 'resol_y_bull_en_tableau',
  482. 5,300,70, _(u"Rayon de la bulle"), 'rayon_bull_en_tableau',
  483. 1,20,3, _(u"Bulles par ligne"), 'nbre_par_ligne_bull_en_tableau',
  484. 1,20,3, _(u"Bulles par colonne"), 'nbre_par_ligne_bull_en_tableau',
  485. 5,200,25, _(u"Largeur de la bordure"), 'larg_bordur_bull_en_tableau',
  486. 5,200,25, _(u"Hauteur de la bordure"), 'haut_bordur_bull_en_tableau',
  487. 100,3584,800, _(u"Largeur finale de l'image"), 'larg_final_img_bull_en_tableau',
  488. 100,3584,800, _(u"Hauteur finale de l'image"), 'haut_final_img_bull_en_tableau')
  489. # ----------------------------------------------------------------------
  490. # Géré par G'MIC
  491. stacked_la_planete_1 = SpinSliders20Possibles(self,
  492. 1,6,2, _(u"Position des doubles"), 'pos_doubles_planete_1',
  493. 10,1000,100, _(u"Rayon de la planète"), 'rayon_planete_1',
  494. 1,500,60, _(u"Dilatation"), 'dilatation_planete_1',
  495. 100,3584,800, _(u"Largeur finale de l'image"), 'larg_final_img_planete_1',
  496. 100,3584,800, _(u"Hauteur finale de l'image"), 'haut_final_img_planete_1')
  497.  
  498. ########Rajout le 4/02/2011 par LUCAS Thomas et CABANA Antoine#########
  499. # ----------------------------------------------------------------------
  500. # Géré par G'MIC
  501. stacked_enflamme = SpinSliders20Possibles(self,
  502. 1,8,4, _(u"Palette de couleur"), 'palette',
  503. 1,4000,478, _(u"Amplitude du B&W sketch"), 'amplitude',
  504. 100,1000,145, _(u"Echantillonnage"), 'sampling',
  505. 1,1000,43, _(u"Lissage"), 'smoothness',
  506. 1,100,2, _(u"Opacité"), 'opacity',
  507. 1,100,15, _(u"Bord"), 'edge',
  508. 1,1000,594, _(u"Amplitude de l'anisotropique smoothing"), 'amplitude1',
  509. 1,200,83, _(u"Netteté"), 'sharpness',
  510. 1,100,92, _(u"Anisotropie"), 'anisotropie',
  511. 1,1000,50, _(u"Gradiant Smoothness"), 'gradiant',
  512. 1,1000,360, _(u"Tensor Smoothness"), 'tensor',
  513. 10,200,57, _(u"Precision spaciale"), 'spacial',
  514. 1,180,33, _(u"Precision angulaire"), 'angle',
  515. 10,500,200, _(u"Valeur de la Precision"), 'value',
  516. 1,10,2, _(u"Iteration"), 'iteration')
  517. ########################################################################
  518. ########Rajout le 7/04/2011 par LUCAS Thomas et CABANA Antoine##########
  519. stacked_predator = FiltreAvecFileDialog(parent=self)
  520. ############################################################
  521. # Widgets du stacked avec 9 boites de spins
  522. stacked_couleursPersonnal = FiltresAvec9Spin(parent=self)
  523.  
  524. # Widgets du stacked avec 3 combos et 2 boites de spins ==> Non car pas réussi donc ...
  525. # _(u"Taille mini de la forme"), 'taille_mini_forme'
  526. # _(u"Taille maxi de la forme"), 'taille_maxi_forme'
  527. # Synonymes de modulation (ton, hauteur, fréquence...)
  528. stacked_separ_en_modules = SpinSliders(self,
  529. 8,60,14, _(u"Taille mini de la forme"), 'taille_mini_forme',
  530. 8,60,18, _(u"Taille maxi de la forme"), 'taille_maxi_forme')
  531.  
  532. # Widgets du stacked avec 8 boites de spins
  533. stacked_ombrEtLumALaCouleur = FiltresAvec8Spin(parent=self)
  534. stacked_contourEtCouleur = FiltresAvec13Spin(parent=self)
  535.  
  536. #=== Ajout de widgets au stacked ===#
  537.  
  538. # Widgets du stacked sans réglage
  539. indexStacked_sansReglage = self.stacked.addWidget(stacked_sansReglage)
  540.  
  541. # Widgets du stacked avec un combo
  542. indexStacked_pointillisme = self.stacked.addWidget(stacked_pointillisme)
  543. indexStacked_couleursPredef = self.stacked.addWidget(stacked_couleursPredef)
  544. indexStacked_evanescence = self.stacked.addWidget(stacked_evanescence)
  545. indexStacked_negatif = self.stacked.addWidget(stacked_negatif)
  546. indexStacked_retournement_img = self.stacked.addWidget(stacked_retournement_img)
  547. indexStacked_laplacien_1 = self.stacked.addWidget(stacked_laplacien_1)
  548.  
  549. # Widgets du stacked avec un/plusieurs combo(s) + boite(s) de spin
  550. indexStacked_encadrePhoto = self.stacked.addWidget(stacked_encadrePhoto)
  551.  
  552. # Widgets du stacked avec une seule boite de spin
  553. indexStacked_sepia = self.stacked.addWidget(stacked_sepia)
  554. indexStacked_traitsNoirs = self.stacked.addWidget(stacked_traitsNoirs)
  555. indexStacked_peuCouleurs = self.stacked.addWidget(stacked_peuCouleurs)
  556. indexStacked_peintHuile = self.stacked.addWidget(stacked_peintHuile)
  557. indexStacked_gamma = self.stacked.addWidget(stacked_gamma)
  558. indexStacked_fonceClair = self.stacked.addWidget(stacked_fonceClair)
  559. indexStacked_peintEau = self.stacked.addWidget(stacked_peintEau )
  560. indexStacked_basRelief = self.stacked.addWidget(stacked_basRelief)
  561. # ----------------------------------------------------------------------
  562. # Géré par G'MIC
  563. indexStacked_dessin_13_coul = self.stacked.addWidget(stacked_dessin_13_coul)
  564. # ----------------------------------------------------------------------
  565. # Géré par G'MIC
  566. indexStacked_dessin_14_crayPapier_2 = self.stacked.addWidget(stacked_dessin_14_crayPapier_2)
  567. # ----------------------------------------------------------------------
  568.  
  569. # Widgets du stacked avec 2 boites de spin
  570. indexStacked_crayonPapier_1 = self.stacked.addWidget(stacked_crayonPapier_1)
  571. indexStacked_blur = self.stacked.addWidget(stacked_blur)
  572. indexStacked_traitCoulFond = self.stacked.addWidget(stacked_traitCoulFond)
  573. indexStacked_seuillage = self.stacked.addWidget(stacked_seuillage)
  574. indexStacked_imitationBd_2 = self.stacked.addWidget(stacked_imitationBd_2)
  575. indexStacked_separ_en_modules = self.stacked.addWidget(stacked_separ_en_modules)
  576. # ----------------------------------------------------------------------
  577. # Géré par G'MIC
  578. indexStacked_correctYeuxRouges = self.stacked.addWidget(stacked_correctionYeuxRouges)
  579. # ----------------------------------------------------------------------
  580. # Géré par G'MIC
  581. ########Rajout le 28/11/2010 par LUCAS Thomas et CABANA Antoine#################
  582. indexStacked_visionThermique = self.stacked.addWidget(stacked_visionThermique)
  583. ################################################################################
  584.  
  585. ########Rajout le 7/04/2011 par LUCAS Thomas et CABANA Antoine##################
  586. indexStacked_predator = self.stacked.addWidget(stacked_predator)
  587. ################################################################################
  588.  
  589. # ----------------------------------------------------------------------
  590.  
  591. # Widgets du stacked avec 3 boites de spin
  592. indexStacked_imitationBd_1 = self.stacked.addWidget(stacked_imitationBd_1)
  593. # ----------------------------------------------------------------------
  594. # Géré par G'MIC
  595. indexStacked_cubismeAnalytique = self.stacked.addWidget(stacked_cubismeAnalytique)
  596. # ----------------------------------------------------------------------
  597. # Géré par G'MIC
  598. indexStacked_expressionnisme = self.stacked.addWidget(stacked_expressionnisme)
  599. # ----------------------------------------------------------------------
  600. # Géré par G'MIC
  601. indexStacked_vieille_photo = self.stacked.addWidget(stacked_vieille_photo)
  602. # ----------------------------------------------------------------------
  603.  
  604. # Widgets du stacked avec 20 boites de spin possibles (classe SpinSliders20Possibles de gui_modules_image.image_base)
  605. # ----------------------------------------------------------------------
  606. # Géré par G'MIC
  607. indexStacked_polaroid = self.stacked.addWidget(stacked_polaroid)
  608. # ----------------------------------------------------------------------
  609. # Géré par G'MIC
  610. indexStacked_oeilleton = self.stacked.addWidget(stacked_oeilleton)
  611. # ----------------------------------------------------------------------
  612. # Géré par G'MIC
  613. indexStacked_andyWarhol = self.stacked.addWidget(stacked_andyWarhol)
  614. # ----------------------------------------------------------------------
  615. # Géré par G'MIC
  616. indexStacked_bullEnTableau = self.stacked.addWidget(stacked_bull_en_tableau)
  617. # ----------------------------------------------------------------------
  618. # Géré par G'MIC
  619. indexStacked_laPlanete_1 = self.stacked.addWidget(stacked_la_planete_1)
  620. # ----------------------------------------------------------------------
  621.  
  622. ########Rajout le 4/02/2011 par LUCAS Thomas et CABANA Antoine#################
  623. indexStacked_enflamme = self.stacked.addWidget(stacked_enflamme)
  624. ################################################################################
  625.  
  626. # Widgets du stacked avec 9 boites de spins
  627. indexStacked_couleursPersonnal = self.stacked.addWidget(stacked_couleursPersonnal)
  628.  
  629. # Widgets du stacked avec 8 boites de spins
  630. indexStacked_ombrEtLumALaCouleur = self.stacked.addWidget(stacked_ombrEtLumALaCouleur)
  631.  
  632. # Widgets du stacked avec 13 boites de spins
  633. indexStacked_contourEtCouleur = self.stacked.addWidget(stacked_contourEtCouleur)
  634.  
  635. # Boîte de combo
  636. self.comboReglage=QComboBox()
  637. # Paramètres de la liste de combo: [(nom entrée, identifiant, index du stacked,
  638. # instance stacked),...]
  639. self.listeComboReglage=[\
  640. (_(u'Vieux Films (bandes + poussières)'), 'vieux_films', indexStacked_sansReglage,\
  641. stacked_sansReglage),\
  642. (_(u'Sepia'), 'sepia', indexStacked_sepia,\
  643. stacked_sepia),\
  644. (_(u'Dessin 1: traits noirs'), 'traits_noirs', indexStacked_traitsNoirs,\
  645. stacked_traitsNoirs),\
  646. (_(u'Dessin 2: crayon à papier 1'), 'crayon_papier_1', indexStacked_crayonPapier_1,\
  647. stacked_crayonPapier_1),\
  648. (_(u'Dessin 3: monochrome'), 'monochrome', indexStacked_sansReglage,\
  649. stacked_sansReglage),\
  650. (_(u'Dessin 4: avec un peu de couleur'), 'peu_couleur', indexStacked_peuCouleurs,\
  651. stacked_peuCouleurs),\
  652. (_(u"Peinture à l'Huile"), 'peinture_huile', indexStacked_peintHuile,\
  653. stacked_peintHuile),\
  654. (_(u'Blur - Floutage'), 'floutage', indexStacked_blur,\
  655. stacked_blur),\
  656. (_(u'Gamma'), 'gamma', indexStacked_gamma,\
  657. stacked_gamma),\
  658. (_(u'Dessin 5: traits de couleurs + fond noir'),'trait_couleur_fond_noir',indexStacked_traitCoulFond,\
  659. stacked_traitCoulFond),\
  660. (_(u'Pointillisme'), 'pointillisme', indexStacked_pointillisme,\
  661. stacked_pointillisme),\
  662. (_(u'Foncé-Clair'), 'fonce_clair', indexStacked_fonceClair,\
  663. stacked_fonceClair),\
  664. (_(u"Peinture à l'eau"), 'peinture_eau', indexStacked_peintEau,\
  665. stacked_peintEau),\
  666. (_(u'Dessin 6: illustration en niveaux de gris'),'illustration_niveau_gris',indexStacked_sansReglage,\
  667. stacked_sansReglage),\
  668. (_(u'Dessin 7: traits très fins + couleur'), 'traits_fins&couleur', indexStacked_sansReglage,\
  669. stacked_sansReglage),\
  670. (_(u'Emboss'), 'emboss', indexStacked_sansReglage,\
  671. stacked_sansReglage),\
  672. (_(u'Sharpen (détails)'), 'sharpen', indexStacked_sansReglage,\
  673. stacked_sansReglage),\
  674. (_(u'Niveaux de Gris'), 'niveau_gris', indexStacked_sansReglage,\
  675. stacked_sansReglage),\
  676. (_(u'Couleurs prédéfinies'), 'couleurs_predefinies', indexStacked_couleursPredef,\
  677. stacked_couleursPredef),\
  678. (_(u'Création de couleurs personnalisées'), 'couleurs_personnalisees',indexStacked_couleursPersonnal,\
  679. stacked_couleursPersonnal),\
  680. (_(u'Bas-relief ou pierre sculptée'), 'bas_relief', indexStacked_basRelief,\
  681. stacked_basRelief),\
  682. (_(u'Amélioration des bords (image plus nette)'),'amelior_des_bords', indexStacked_sansReglage,\
  683. stacked_sansReglage),\
  684. (_(u'Réduction du bruit (débruitage)'), 'debruitage', indexStacked_sansReglage,\
  685. stacked_sansReglage),\
  686. (_(u'Dessin 8: seuillage des images'), 'seuillage', indexStacked_seuillage,\
  687. stacked_seuillage),\
  688. (_(u'Dessin 9: evanescence'), 'evanescence', indexStacked_evanescence,\
  689. stacked_evanescence),\
  690. (_(u'Dessin 10: imitation bande dessinée 1'), 'imitation_bd_1', indexStacked_imitationBd_1,\
  691. stacked_imitationBd_1),\
  692. (_(u'Négatif (inverse les couleurs/valeurs)'), 'negatif', indexStacked_negatif,\
  693. stacked_negatif),\
  694. (_(u'Encadrement photographique'), 'encadre_photo', indexStacked_encadrePhoto,\
  695. stacked_encadrePhoto),\
  696. (_(u'Séparation en modules'), 'separ_en_modules', indexStacked_separ_en_modules,\
  697. stacked_separ_en_modules),\
  698. (_(u'Ombre et lumière à la couleur'), 'omb_lum_a_la_coul', indexStacked_ombrEtLumALaCouleur,\
  699. stacked_ombrEtLumALaCouleur),\
  700. (_(u'Rotation image'), 'rotation_image', indexStacked_retournement_img,\
  701. stacked_retournement_img),\
  702. (_(u'Dessin 11: imitation bande dessinée 2'), 'imitation_bd_2', indexStacked_imitationBd_2,\
  703. stacked_imitationBd_2),\
  704. (_(u'Dessin 12: laplacien'), 'laplacien_1', indexStacked_laplacien_1,\
  705. stacked_laplacien_1),\
  706. (_(u'Contour et couleur'), 'contour_et_couleur', indexStacked_contourEtCouleur,\
  707. stacked_contourEtCouleur),\
  708. (_(u'Dessin 13: en couleur'), 'dessin_13_couleur', indexStacked_dessin_13_coul,\
  709. stacked_dessin_13_coul),\
  710. (_(u'Dessin 14: crayon à papier 2'), 'crayon_papier_2', indexStacked_dessin_14_crayPapier_2,\
  711. stacked_dessin_14_crayPapier_2),\
  712. (_(u'Atténuation des yeux rouges'), 'correct_yeux_rouges', indexStacked_correctYeuxRouges,\
  713. stacked_correctionYeuxRouges),\
  714. (_(u'Solarisation'), 'solarisation', indexStacked_sansReglage,\
  715. stacked_sansReglage),\
  716. (_(u'Oeilleton'), 'oeilleton', indexStacked_oeilleton,\
  717. stacked_oeilleton),\
  718. (_(u'Polaroïd'), 'polaroid', indexStacked_polaroid,\
  719. stacked_polaroid),\
  720. (_(u'Vieille photo'), 'vieille_photo', indexStacked_vieille_photo,\
  721. stacked_vieille_photo),\
  722. (_(u'Cubisme analytique'), 'cubisme_analytique', indexStacked_cubismeAnalytique,\
  723. stacked_cubismeAnalytique),\
  724. (_(u'Andy Warhol'), 'andy_warhol', indexStacked_andyWarhol,\
  725. stacked_andyWarhol),\
  726. (_(u'Expressionnisme'), 'expressionnisme', indexStacked_expressionnisme,\
  727. stacked_expressionnisme),\
  728. (_(u'Bulles en tableau'), 'bull_en_tableau', indexStacked_bullEnTableau,\
  729. stacked_bull_en_tableau),\
  730. (_(u'La planète 1'), 'la_planete_1', indexStacked_laPlanete_1,\
  731. stacked_la_planete_1),\
  732. (_(u'Vision thermique'), 'vision_thermique', indexStacked_visionThermique,\
  733. stacked_visionThermique),\
  734. ########Rajout le 4/02/2011 par LUCAS Thomas et CABANA Antoine########################################
  735. (_(u'Enflamme'), 'enflamme', indexStacked_enflamme,\
  736. stacked_enflamme),\
  737. #######################################################################################################
  738. ########Rajout le 7/04/2011 par LUCAS Thomas et CABANA Antoine###################################
  739. (_(u'Predator'), 'predator', indexStacked_predator,\
  740. stacked_predator)]
  741. #######################################################################################################
  742. ###########################
  743. # Conversion en CMYK retiré le 30/11/08
  744. # (_(u'Conversion en CMYK'), 'cmyk', indexStacked_sansReglage,\
  745. # stacked_sansReglage),\
  746. ###########################
  747.  
  748. # Insertion des codecs de compression dans la boite de combo
  749. for i in self.listeComboReglage:
  750. self.comboReglage.addItem(QIcon("Icones" + os.sep + "Exemples" + os.sep + str(i[1]) + ".jpg"), i[0], QVariant(i[1]))
  751.  
  752. self.comboReglage.setIconSize(QSize(48, 36))
  753. self.connect(self.comboReglage, SIGNAL("currentIndexChanged(int)"), self.changerComboReglage)
  754. # Affiche l'entrée de la boite de combo inscrite dans un fichier de configuration
  755. self.base.valeurComboIni(self.comboReglage, self.config, self.idSection, 'filtre')
  756.  
  757. # Gestion du nombre d'images à traiter
  758. # Se trouve maintenant directement dans l'onglet Réglages
  759. self.grid = QGridLayout()
  760. self.grid.addWidget(QLabel(_(u"Traitement à partir de l'image (numéro)")), 0, 0)
  761. self.spin1valNombres=SpinSlider(1, 100000, 1, '', self)
  762. self.grid.addWidget(self.spin1valNombres, 0, 1)
  763. self.connect(self.spin1valNombres, SIGNAL("valueChanged(int)"), self.changeValNbreImg_1)
  764. self.grid.addWidget(QLabel(_(u"Nombre de chiffres après le nom de l'image")), 1, 0)
  765. self.spin2valNombres=SpinSlider(3, 18, 6, '', self)
  766. self.grid.addWidget(self.spin2valNombres, 1, 1)
  767. self.connect(self.spin2valNombres, SIGNAL("valueChanged(int)"), self.changeValNbreImg_1)
  768.  
  769. self.grid.setAlignment(Qt.AlignHCenter)
  770. vboxReglage.addLayout(self.grid)
  771. vboxReglage.addStretch()
  772.  
  773. hbox = QHBoxLayout()
  774. hbox.addWidget(QLabel(_(u'Type')))
  775. hbox.addWidget(self.comboReglage)
  776. hbox.setAlignment(Qt.AlignHCenter)
  777.  
  778. self.scroll = QScrollArea()
  779. self.scroll.setWidget(self.stacked)
  780.  
  781. vboxReglage.addLayout(hbox)
  782. vboxReglage.addWidget(self.scroll)
  783. #vboxReglage.addWidget(self.stacked)
  784. vboxReglage.addStretch()
  785.  
  786. #----------------
  787. # Onglet de log
  788. #----------------
  789.  
  790. self.zoneAffichInfosImg = QTextEdit("")
  791. if PYQT_VERSION_STR < "4.1.0":
  792. self.zoneAffichInfosImg.setText = self.zoneAffichInfosImg.setPlainText
  793. self.zoneAffichInfosImg.setReadOnly(True)
  794. self.framInfos=QFrame()
  795. vboxInfIm=QVBoxLayout(self.framInfos)
  796. vboxInfIm.addWidget(self.zoneAffichInfosImg)
  797.  
  798. # -------------------------------------------------
  799. # Onglets d'affichage image source et destination
  800. # -------------------------------------------------
  801.  
  802. # Là où s'afficheront les images
  803. self.afficheurImgSource=SelectWidget(mode="icone", geometrie = self.mainWindowFrameGeometry)
  804. self.afficheurImgDestination=Lecture_VisionImage(statusBar)
  805.  
  806. # Curseur de parcours des images source ou destination
  807. # Déclaré ici à cause d'un bogue pas très logique sous MAC (bilbon)
  808. #self.curseur = QSlider(Qt.Horizontal)
  809. #self.curseur.setEnabled(False)
  810.  
  811. vbox.addWidget(self.tabwidget)
  812.  
  813. self.indexTabImgSource = self.tabwidget.addTab(self.afficheurImgSource, _(u'Image(s) source'))
  814. self.indexTabImgReglage = self.tabwidget.addTab(self.framReglage, _(u'Réglages'))
  815. self.indexTabImgDestin = self.tabwidget.addTab(self.afficheurImgDestination, _(u'Images après traitement'))
  816. self.indexTabImgInfos = self.tabwidget.addTab(self.framInfos, _(u'Infos'))
  817.  
  818. # -------------------------------------------
  819. # widgets du bas : curseur + ligne + boutons
  820. # -------------------------------------------
  821.  
  822. # Boutons
  823. self.boutAide=QPushButton(_(u" Aide"))
  824. self.boutAide.setIcon(QIcon("Icones" + os.sep + "icone_aide_128.png"))
  825. self.connect(self.boutAide, SIGNAL("clicked()"), self.afficherAide)
  826. self.boutApPremImg = QPushButton(_(u" Voir le résultat"))
  827. self.boutApPremImg.setIcon(QIcon("Icones" + os.sep + "icone_visionner_128.png"))
  828. self.boutApPremImg.setFocusPolicy(Qt.NoFocus)
  829. self.boutApPremImg.setEnabled(False)
  830. self.connect(self.boutApPremImg, SIGNAL("clicked()"), self.visu_1ere_img)
  831. self.boutAppliquer=QPushButton(_(u" Appliquer et sauver"))
  832. self.boutAppliquer.setIcon(QIcon("Icones" + os.sep + "icone_appliquer_128.png"))
  833. self.boutAppliquer.setEnabled(False)
  834.  
  835. self.connect(self.boutAppliquer, SIGNAL("clicked()"), self.appliquer0)
  836.  
  837. # Ligne de séparation juste au dessus des boutons
  838. ligne = QFrame()
  839. ligne.setFrameShape(QFrame.HLine)
  840. ligne.setFrameShadow(QFrame.Sunken)
  841. vbox.addWidget(ligne)
  842. vbox.addSpacing(-5) # la ligne doit être plus près des boutons
  843.  
  844. hbox=QHBoxLayout()
  845. hbox.addWidget(self.boutAide)
  846. hbox.addStretch()
  847. hbox.addWidget(self.boutApPremImg)
  848. hbox.addStretch()
  849. hbox.addWidget(self.boutAppliquer)
  850. vbox.addLayout(hbox)
  851.  
  852. #-----------------------------
  853. # Barre de progression
  854. #-----------------------------
  855.  
  856. self.progress=QProgressDialog(_(u"Filtrage en cours..."), _(u"Arrêter"), 0, 100)
  857. self.progress.setWindowTitle(_(u'EnKoDeur-Mixeur. Fenêtre de progression'))
  858. self.progress.setMinimumWidth(500)
  859. self.progress.setMinimumHeight(100)
  860. self.connect(self.progress, SIGNAL("canceled()"), self.arretProgression)
  861.  
  862.  
  863. # affichage de la boîte principale
  864. self.setLayout(vbox)
  865.  
  866. self.connect(self.tabwidget, SIGNAL("currentChanged(int)"), self.fctTab)
  867.  
  868. #----------------------------------------------------------------------------------------------------
  869. # Signal de présence d'images dans ler widget de sélection -> modifie le statut des boutons d'action
  870. #----------------------------------------------------------------------------------------------------
  871.  
  872. self.connect(self.afficheurImgSource, SIGNAL("pictureChanged(int)"), self.modifBoutonsAction)
  873.  
  874.  
  875. def modifBoutonsAction(self, i):
  876. "On active ou désactive les boutons d'action selon s'il y a des images ou pas dans le widget de sélection"
  877. self.boutAppliquer.setEnabled(i)
  878. self.boutApPremImg.setEnabled(i)
  879. self.modifImageSource = 1
  880.  
  881.  
  882. def changerComboReglage(self, i):
  883. """L'entrée sélectionnée de la boîte de combo modifie le QFrame de réglage du codec associée"""
  884. self.stacked.setCurrentIndex(self.listeComboReglage[i][2])
  885. self.config.set(self.idSection, 'filtre',self.listeComboReglage[i][1])
  886.  
  887.  
  888. def changeValNbreImg_1(self):
  889. """gestion du nombre d'images à traiter"""
  890. print "Traitement a partir de l'image (numero):", self.spin1valNombres.value()
  891. print "Nombre de chiffres apres le nom de l'image:", self.spin2valNombres.value()
  892.  
  893.  
  894. def fctTab(self, i):
  895. "Affichage d'une ou plusieurs images converties"
  896.  
  897. # Cela ne concerne que l'onglet de visualisation des images après leur conversion
  898. if i == self.indexTabImgDestin:
  899. if self.conversionImg:
  900. # Affichage si on sauvegarde par le bouton Appliquer et sauver
  901. print "La conversion vient d'avoir lieu -> affichage des images du lot de destination"
  902. cheminImages = os.path.dirname(self.listeImgDestin[0])
  903. liste = []
  904. for fichier in self.listeImgDestin:
  905. liste.append(os.path.basename(fichier))
  906. self.afficheurImgDestination.updateImages(liste, cheminImages)
  907. elif not self.boutAppliquer.isEnabled() or self.modifImageSource:
  908. # Si le bouton de conversion n'est pas actif, c'est qu'il n'y a plus d'image source
  909. # -> on n'a plus de raison de maintenir des images dans l'afficheur de résultat
  910. # Si les images sources ont été modifiées, on purge aussi l'afficheur de résultat
  911. self.afficheurImgDestination.updateImages([])
  912. self.conversionImg = 0
  913. self.modifImageSource = 0
  914.  
  915.  
  916. def metaFctTab(self, i):
  917. """Changement d'onglet (conçu pour sélectionner les onglets "Images Source" après le chargement de nouvelles images sources ou "Images Après Traitement" après la conversion). But: s'assurer que la fonction associée au QTabWidget (affichage d'images, grisage/dégrisage du curseur...) sera bien appliquée même si on est déjà sur le bon onglet"""
  918. if self.tabwidget.currentIndex()!=i:
  919. self.tabwidget.setCurrentIndex(i)
  920. else: self.fctTab(i)
  921.  
  922.  
  923. def logFinal(self, titreFiltre):
  924. """Affichage des informations de conversion"""
  925. a='#'*36
  926. # On ne récupère pas l'ancien % car il est arrondi
  927. pourCent=round(float(len(self.listeImgDestin))/len(self.listeImgSource)*100)
  928. pourCent = "%.0f" %pourCent
  929. b = a + '\n# ' + _(u'Filtre utilisé: ') + titreFiltre + '\n' + a + '\n'
  930. c = _(u"nombre d'images converties / nombre d'images sources")+" = "+str(len(self.listeImgDestin))+" / "\
  931. +str(len(self.listeImgSource))+" = " + pourCent +" %\n\n"
  932.  
  933. # Le dernier '\n' est parfois nécessaire pour voir la dernière ligne!
  934. self.zoneAffichInfosImg.setText(b+c+self.infosImgTitre[0]+\
  935. "\n".join(self.listeImgSource)+'\n\n'+self.infosImgTitre[1]+"\n".join(self.listeImgDestin)+'\n')
  936.  
  937.  
  938. def stat_dim_img(self):
  939. """Calcul statistique des dimensions des images les plus présentes dans le lot"""
  940.  
  941. # Ouverture et mise ds une liste des dimensions des images
  942. listePrepaRedim=[Image.open(aA).size for aA in self.listeImgSource]
  943.  
  944. # Merci beaucoup à Marc Keller de la liste: python at aful.org de m'avoir
  945. # aidé pour cette partie (les 4 lignes en dessous)
  946. dictSeq={}.fromkeys(listePrepaRedim, 0)
  947. for cle in listePrepaRedim: dictSeq[cle]+=1
  948. self.lStatDimSeq=sorted(zip(dictSeq.itervalues(), dictSeq.iterkeys()), reverse=1)
  949. self.dimStatImg=self.lStatDimSeq[0][1]
  950.  
  951. print "Toutes les dimensions des images (avec le nbre d'images):", self.lStatDimSeq
  952. print 'Dimension des images la plus presente dans la sequence:', self.dimStatImg
  953. print "Nombre de tailles d'images différentes dans le lot :", len(self.lStatDimSeq)
  954.  
  955. if len(self.lStatDimSeq)>1: return 0
  956. else: return 1
  957.  
  958.  
  959. def redim_img(self):
  960. """Si l'utilisateur charge des images avec des tailles complètement différentes --> les images de la séquence peuvent être redimensionnées"""
  961.  
  962. if not self.stat_dim_img():
  963. reply = QMessageBox.warning(self, 'Message',
  964. _(u"Vos images ne sont pas toutes de la même taille. Voulez-vous redimensionner les images de sortie à la taille la plus répandue dans la séquence?"), QMessageBox.Yes, QMessageBox.No)
  965. if reply == QMessageBox.No:
  966. return
  967.  
  968. # Les images de tailles différentes à la plus répandue sont redimensionnées
  969. # dans un répertoire temporaire.
  970. # Les images redimensionnées voient leur chemin modifié dans la liste des
  971. # chemins des images sources. Les autres chemins ne changent pas.
  972. index=0
  973. for chemImg in self.listeImgSource:
  974. obImg=Image.open(chemImg)
  975. if obImg.size!=self.dimStatImg:
  976. pass
  977. sRedim=obImg.resize(self.dimStatImg, Image.ANTIALIAS)
  978. chemSortie = self.repTampon+'redim'+os.sep+os.path.basename(chemImg)
  979. sRedim.save(chemSortie)
  980. self.listeImgSource[index] = chemSortie
  981. index += 1
  982.  
  983.  
  984. def appliquerCouleursPredef(self):
  985. """Conversion des images pour le filtre: Couleurs Prédéfinies"""
  986. indexCombo = self.listeComboReglage[self.i][3].combo.currentIndex()
  987. entreeCombo = str(self.listeComboReglage[self.i][3].combo.itemData(indexCombo).toStringList()[0])
  988.  
  989. if entreeCombo=="rouge_vif":
  990. couleur_Img_Predef=(
  991. 1.0, 0.3, 0.0, 0,
  992. 0.0, 0.0, 0.0, 0,
  993. 0.0, 0.0, 0.0, 0)
  994. elif entreeCombo=="rouge_primaire":
  995. couleur_Img_Predef=(
  996. 1.0, 0.3, 0.0, 0,
  997. 0.0, 0.0, 0.0, 0,
  998. 0.7, 0.0, 0.0, 0)
  999. elif entreeCombo=="vert_perroquet":
  1000. couleur_Img_Predef=(
  1001. 0.0, 0.0, 0.0, 0,
  1002. 1.0, 0.3, 0.0, 0,
  1003. 0.0, 0.0, 0.0, 0)
  1004. elif entreeCombo=="vert_acide_clair":
  1005. couleur_Img_Predef=(
  1006. 1.0, 0.0, 0.0, 0,
  1007. 1.0, 0.3, 0.0, 0,
  1008. 0.0, 0.0, 0.0, 0)
  1009. elif entreeCombo=="bleu_roi":
  1010. couleur_Img_Predef=(
  1011. 0.0, 0.0, 0.0, 0,
  1012. 1.0, 0.0, 0.0, 0,
  1013. 1.0, 1.0, 0.0, 0)
  1014. elif entreeCombo=="bleu_indigo":
  1015. couleur_Img_Predef=(
  1016. 1.0, 0.0, 0.0, 0,
  1017. 1.0, 0.0, 0.0, 0,
  1018. 1.0, 1.0, 0.0, 0)
  1019. elif entreeCombo=="bleu_turquoise":
  1020. couleur_Img_Predef=(
  1021. 1.0, 0.0, 0.0, 0,
  1022. 1.0, 1.0, 0.0, 0,
  1023. 1.0, 1.0, 0.0, 0)
  1024. elif entreeCombo=="jaune_or":
  1025. couleur_Img_Predef=(
  1026. 0.64, 0.64, 0.10, 0,
  1027. 0.56, 0.56, 0.10, 0,
  1028. 0.0, 0.0, 0.0, 0)
  1029. elif entreeCombo=="jaune_orange":
  1030. couleur_Img_Predef=(
  1031. 1.0, 0.5, 0.5, 0,
  1032. 1.0, 0.3, 0.0, 0,
  1033. 0.0, 0.0, 0.0, 0)
  1034. elif entreeCombo=="saumon":
  1035. couleur_Img_Predef=(
  1036. 1.0, 0.5, 0.0, 0,
  1037. 1.0, 0.1, 0.0, 0,
  1038. 1.0, 0.0, 0.0, 0)
  1039. elif entreeCombo=="marron_tres_clair":
  1040. couleur_Img_Predef=(
  1041. 0.95, 0.38, 0.0, 0,
  1042. 0.90, 0.15, 0.0, 0,
  1043. 0.48, 0.26, 0.0, 0)
  1044. elif entreeCombo=="terre argileuse":
  1045. couleur_Img_Predef=(
  1046. 0.96, 0.58, 0.0, 0,
  1047. 0.56, 0.44, 0.0, 0,
  1048. 0.46, 0.32, 0.0, 0)
  1049. elif entreeCombo=="gris_colore_rouge":
  1050. couleur_Img_Predef=(
  1051. 0.68, 0.68, 0.0, 0,
  1052. 0.50, 0.50, 0.0, 0,
  1053. 0.50, 0.50, 0.0, 0)
  1054. elif entreeCombo=="gris_colore_vert":
  1055. couleur_Img_Predef=(
  1056. 0.50, 0.50, 0.0, 0,
  1057. 0.62, 0.62, 0.0, 0,
  1058. 0.50, 0.50, 0.0, 0)
  1059. elif entreeCombo=="gris_colore_bleu":
  1060. couleur_Img_Predef=(
  1061. 0.50, 0.50, 0.0, 0,
  1062. 0.50, 0.50, 0.0, 0,
  1063. 0.64, 0.64, 0.0, 0)
  1064. elif entreeCombo=="gris_colore_jaune":
  1065. couleur_Img_Predef=(
  1066. 0.62, 0.62, 0.0, 0,
  1067. 0.62, 0.62, 0.0, 0,
  1068. 0.50, 0.50, 0.0, 0)
  1069.  
  1070. for self.j in self.listeIndex:
  1071. # Sauvegarde
  1072. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  1073. obImg = Image.open(self.listeImgSource[self.j])
  1074. convert = obImg.convert("RGB").convert("RGB", couleur_Img_Predef)
  1075. convert.save(self.cheminCourantSauv)
  1076. if not self.opReccurApresApp(): return
  1077.  
  1078.  
  1079. def appliquerVieuxFilms(self):
  1080. """Conversion des images pour le filtre: Vieux Films"""
  1081. listePous=[
  1082. 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_001.png', 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_002.png',
  1083. 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_003.png', 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_004.png',
  1084. 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_005.png', 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_006.png',
  1085. 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_007.png', 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_008.png',
  1086. 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_009.png', 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_010.png',
  1087. 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_011.png', 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_012.png',
  1088. 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_013.png', 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_014.png',
  1089. 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_015.png', 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_016.png',
  1090. 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_017.png', 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_018.png',
  1091. 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_019.png', 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_020.png',
  1092. 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_021.png', 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_022.png',
  1093. 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_023.png', 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_024.png',
  1094. 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_025.png', 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_026.png']
  1095.  
  1096. for self.j in self.listeIndex:
  1097.  
  1098. process = QProcess(self)
  1099.  
  1100. # Uniquement pour Linux et MacOSX
  1101. if os.name in ['posix', 'mac']:
  1102.  
  1103. process.start("convert -blur 1%x1% -fx intensity ""\""+self.listeImgSource[self.j]+"\" "+self.repTampon+"vf_vieux_films1")
  1104. if not process.waitForStarted(3000):
  1105. QMessageBox.warning(None, _(u"Erreur"), _(u"Bogue au lancement de la commande"))
  1106. process.waitForFinished(-1)
  1107.  
  1108. # Uniquement pour windows
  1109. elif os.name == 'nt':
  1110.  
  1111. # Attention ici dans la version windows ce n'est pas traité par un
  1112. # QProcess (comme sous Linux) mais directement avec os.system (car le
  1113. # QProcess avec la commande convert d'ImageMagick génère une erreur)
  1114. os.system("convert -blur 1%x1% -fx intensity "+"\""+self.listeImgSource[self.j]+"\""+' '+"\""+self.repTampon+"vf_vieux_films1"+"\"")
  1115.  
  1116. img0=Image.open(self.listeImgSource[self.j])
  1117. taille=img0.size
  1118.  
  1119. # Uniquement pour Linux et MacOSX
  1120. if os.name in ['posix', 'mac']:
  1121.  
  1122. process.start("convert "+listePous[randrange(len(listePous))]+" -resize "+ str(taille[0])+'x'+str(taille[1])+"! "+self.repTampon+"vf_vieux_films2")
  1123. if not process.waitForStarted(3000):
  1124. QMessageBox.warning(None, _(u"Erreur"), _(u"Bogue au lancement de la commande"))
  1125. process.waitForFinished(-1)
  1126.  
  1127. # Uniquement pour windows
  1128. elif os.name == 'nt':
  1129.  
  1130. # Attention ici dans la version windows ce n'est pas traité par un
  1131. # QProcess (comme sous Linux) mais directement avec os.system (car le
  1132. # QProcess avec la commande convert d'ImageMagick génère une erreur)
  1133. os.system("convert "+"\""+listePous[randrange(len(listePous))]+"\""+" -resize "+ str(taille[0])+'x'+str(taille[1])+"! "+"\""+self.repTampon+"vf_vieux_films2"+"\"")
  1134.  
  1135. img1 = Image.open(self.repTampon+"vf_vieux_films2")
  1136. img2 = Image.open(self.repTampon+"vf_vieux_films1")
  1137. compos = Image.composite(img1,img2,img1)
  1138.  
  1139. # Sauvegarde
  1140. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  1141. compos.save(self.cheminCourantSauv)
  1142.  
  1143. if not self.opReccurApresApp(): return
  1144. self.j += 1
  1145.  
  1146.  
  1147. def appliquerSeuillage(self):
  1148. """ Dessin 8: seuillage (avec intégration de syntaxe Numpy) """
  1149. for self.j in self.listeIndex:
  1150. # Ouverture des images
  1151. obImg = Image.open(self.listeImgSource[self.j])
  1152. # Récup réglages de seuillage bas et seuillage haut
  1153. spin1 = self.listeComboReglage[self.i][3].spin1.value() # seuil bas
  1154. spin2 = self.listeComboReglage[self.i][3].spin2.value() # seuil haut
  1155. # La valeur de seuil bas ne doit jamais être supérieure ou égale à la valeur de
  1156. # seuil haut (produirait des images sans interêt) --> dans ce cas le processus
  1157. # s'arrête et un message avertit l'utilisateur.
  1158. if spin1>=spin2:
  1159. erreur=QMessageBox(self)
  1160. erreur.setText(_(u"Attention, <b>la valeur de seuillage bas doit obligatoirement être inférieure à la valeur de seuillage haut</b>. La conversion demandée ne sera pas effectuée. Refaites vos réglages correctement et recommencez l'opération."))
  1161. erreur.setWindowTitle(_(u"Erreur de réglage"))
  1162. erreur.setIcon(QMessageBox.Warning)
  1163. erreur.exec_()
  1164. break
  1165. else: pass
  1166. # Conversion et sauvegarde en niveaux de gris
  1167. imageNDG = obImg.convert("L")
  1168. # Recup dimensions de l'image
  1169. wSeuil, hSeuil = imageNDG.size
  1170. # Filtre egalisateur pour renforcer les zones claires et les zones foncées
  1171. egaliseNDG_Seuil = ImageOps.equalize(imageNDG)
  1172. # Creation d'une nouvelle image
  1173. nouvImgNDG_Seuil = Image.new("L", (wSeuil, hSeuil))
  1174. # Insertion data ds nouvImgNDG_Seuil
  1175. nouvImgNDG_Seuil.putdata(egaliseNDG_Seuil.getdata())
  1176. # Récup des données contenues ds l'image et mises dans un tableau par Numpy
  1177. dataNDG_Seuil=array(nouvImgNDG_Seuil)
  1178. # Aplatissement du tableau pour traitement
  1179. aplatNDG_Seuil=dataNDG_Seuil.flat
  1180. # Condition: (apres parcours de chaque element du tableau)
  1181. # ==> correspond en python classique a :
  1182. # if aplatNDG_Seuil>=spin1 and aplatNDG_Seuil<=spin2:
  1183. # Les pixels blancs seront placés ici.
  1184. condSeuil=(aplatNDG_Seuil>=spin1)&(aplatNDG_Seuil<=spin2)
  1185. # Selon la condition, remplacement de chaque element/pixel
  1186. # soit par 0 --> noir, soit par 255 --> blanc .
  1187. idSeuil=where(condSeuil, 0, 255)
  1188. # Creation d'une nouvelle image
  1189. nouvImgBinaire=Image.new("L", (wSeuil, hSeuil))
  1190. # Insertion data ds nouvImgBinaire et conversion en liste classique
  1191. nouvImgBinaire.putdata(idSeuil.tolist())
  1192. # Sauvegarde
  1193. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  1194. nouvImgBinaire.save(self.cheminCourantSauv)
  1195. # Fin
  1196. if not self.opReccurApresApp(): return
  1197. self.j += 1
  1198.  
  1199.  
  1200. def appliquerEvanescence(self):
  1201. """ Dessin 9: traits noirs, fond blanc (avec intégration de syntaxe Numpy) """
  1202. for self.j in self.listeIndex:
  1203. # Récupération de l'index et l'entrée du combo de sélection
  1204. indexCombo = self.listeComboReglage[self.i][3].combo.currentIndex()
  1205. entreeCombo = str(self.listeComboReglage[self.i][3].combo.itemData(indexCombo).toStringList()[0])
  1206. # Ouverture des images. Conversion et sauvegarde en niveaux de gris
  1207. obImg = Image.open(self.listeImgSource[self.j]).convert("L")
  1208. # Recup dimensions de l'image
  1209. w, h = obImg.size
  1210. # Kernel 5x5 Réduction du Bruit
  1211. imKernel = obImg.filter(ImageFilter.Kernel((5, 5), (-2, -2, -2, -2, -2, -1, -1, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, -1, -1, -2, -2, -2, -2, -2)))
  1212. imKernel.save(self.repTampon+'_tmp_g546gf546ezr53ww7i.png', 'PNG')
  1213. # Ouverture de l'image temporaire
  1214. ouvImg = Image.open(self.repTampon+'_tmp_g546gf546ezr53ww7i.png')
  1215. # Filtre egalisateur pour renforcer les zones claires et les zones foncées
  1216. egalise = ImageOps.equalize(ouvImg)
  1217. # Creation d'une nouvelle image
  1218. nouvImg = Image.new("L", (w, h))
  1219. # Insertion data ds nouvImg
  1220. nouvImg.putdata(egalise.getdata())
  1221. # Récup des données contenues ds l'image et mises dans un tableau par Numpy
  1222. data = array(nouvImg)
  1223. # Aplatissement du tableau pour traitement
  1224. aplat = data.flat
  1225. # Condition: (apres parcours de chaque element du tableau)
  1226. condition=(aplat>=1)&(aplat<=255)
  1227. # Selon la condition, remplacement de chaque element/pixel
  1228. # soit par 255 --> blanc, soit par 0 --> noir
  1229. if entreeCombo=='fond_blanc_lignes_noires': idCond = where(condition, 255, 0)
  1230. elif entreeCombo=='fond_noir_lignes_blanches': idCond = where(condition, 0, 255)
  1231. # Creation d'une nouvelle image
  1232. nouvImgBinaire=Image.new("L", (w, h))
  1233. # Insertion data ds nouvImgBinaire et conversion en liste classique
  1234. nouvImgBinaire.putdata(idCond.tolist())
  1235. # Sauvegarde
  1236. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext ##
  1237. nouvImgBinaire.save(self.cheminCourantSauv)
  1238. # Fin
  1239. if not self.opReccurApresApp(): return
  1240. self.j += 1
  1241. # Purge du répertoire tampon
  1242. os.remove(self.repTampon+'_tmp_g546gf546ezr53ww7i.png')
  1243.  
  1244.  
  1245. def appliquerImitationBd_1(self):
  1246. """ Dessin 10: imitation bande dessinée (avec intégration [un peu] de syntaxe Numpy) """
  1247. for self.j in self.listeIndex:
  1248. # Récup réglages ci-dessous
  1249. spin1 = self.listeComboReglage[self.i][3].spin1.value() # intensité des traits
  1250. spin2 = self.listeComboReglage[self.i][3].spin2.value() # réduction des couleurs
  1251. spin3 = self.listeComboReglage[self.i][3].spin3.value() # contraste de couleurs
  1252. # Ouverture des images. Conversion et sauvegarde en niveaux de gris
  1253. obImg = Image.open(self.listeImgSource[self.j]).convert("L")
  1254. # Recup dimensions de l'image
  1255. w, h = obImg.size
  1256.  
  1257. # Partie 1 ------ Détection du contour des formes et traçage des futurs traits noirs ----
  1258. # Kernel 5x5 Réduction du Bruit + ajout de la valeur de spin1 au centre de la matrice
  1259. imKernel = obImg.filter(ImageFilter.Kernel((5, 5), (-2, -2, -2, -2, -2, -1, -1, 0, 0, 0, 0, 0, spin1, 0, 0, 0, 0, 0, -1, -1, -2, -2, -2, -2, -2)))
  1260. imKernel.save(self.repTampon+'tmp_gds568ec4u5hg53g7s9m4rt.png', 'PNG')
  1261. # Ouverture de l'image temporaire
  1262. ouvImg = Image.open(self.repTampon+'tmp_gds568ec4u5hg53g7s9m4rt.png')
  1263. # Filtre egalisateur pour renforcer les zones claires et les zones foncées
  1264. egalise = ImageOps.equalize(ouvImg)
  1265. # Creation d'une nouvelle image
  1266. nouvImg = Image.new("L", (w, h))
  1267. # Insertion data ds nouvImg
  1268. nouvImg.putdata(egalise.getdata())
  1269. # Récup des données contenues ds l'image et mises dans un tableau par Numpy
  1270. data = array(nouvImg)
  1271. # Aplatissement du tableau pour traitement
  1272. aplat = data.flat
  1273. # Condition: (apres parcours de chaque element du tableau)
  1274. condition = (aplat>=1)&(aplat<=255)
  1275. # Selon la condition, remplacement de chaque element/pixel
  1276. # soit par 255 --> blanc, soit par 0 --> noir
  1277. idCond = where(condition, 255, 0)
  1278. # Creation d'une nouvelle image
  1279. nouvImgBinaire = Image.new("L", (w, h))
  1280. # Insertion data ds nouvImgBinaire et conversion en liste classique
  1281. nouvImgBinaire.putdata(idCond.tolist())
  1282. # Recup des donnees
  1283. listeAlpha_1=list(nouvImgBinaire.getdata())
  1284. # Creation de la liste newListRGBAbin
  1285. newListRGBAbin=[]
  1286. for parcListe in listeAlpha_1:
  1287. # Si on a des pixels blancs et transparents dans listeAlpha_1 alors on injecte
  1288. # des pixels blancs transparents mais ce coup-ci en mode RGBA .
  1289. if parcListe==255: newListRGBAbin.append((255, 255, 255, 0))
  1290. # (Autre) si on a des pixels noirs et opaques dans listeAlpha_1
  1291. # alors on injecte des pixels noirs opaques mais ce coup-ci en
  1292. # mode RGBA .
  1293. else: newListRGBAbin.append((0, 0, 0, 255))
  1294.  
  1295. # Creation d'une nouvelle image
  1296. nouvImgRGBA=Image.new("RGBA", (w, h))
  1297. # Insertion data ds nouvImgRGBA
  1298. nouvImgRGBA.putdata(newListRGBAbin)
  1299. # Sauvegarde image temporaire
  1300. nouvImgRGBA.save(self.repTampon+'tmp_gds568ec4u5hg53g7s9m4rt.png', 'PNG')
  1301. # Attention il faut diviser par 10.0 la valeur de spin3 (c'est à dire contraste
  1302. # de couleurs). On divise par 10.0 et pas 10 !.
  1303. spin3=float(spin3/10.0)
  1304.  
  1305. # Partie 2 ------ Réduction/postérisation/contraste des couleurs du fond de l'image -----
  1306. # Ouverture de l'image principale dans le lot
  1307. imPrinc=Image.open(self.listeImgSource[self.j])
  1308. # Application du filtre pour la reduction des couleurs
  1309. imPosterize=ImageOps.posterize(imPrinc, spin2)
  1310. # Conversion en RGBA pour pouvoir compositer ...
  1311. imPosterize.convert('RGBA')
  1312. imPosterize.save(self.repTampon+'tmp_gds89gfdt39xfg6d9qxx1f.png', 'PNG')
  1313. # Ouverture de l'image posterizee pour poursuite du traitement (application contraste)
  1314. imPostTraitC=Image.open(self.repTampon+'tmp_gds89gfdt39xfg6d9qxx1f.png')
  1315. # Application du filtre contraste et sauvegarde du fichier temporaire
  1316. imContraste=ImageEnhance.Contrast(imPostTraitC)
  1317. imContraste.enhance(spin3).save(self.repTampon+'tmp_gds486fsf68q2wx5k7u1oop.png', 'PNG')
  1318. # Ouverture de l'image posterizee ensuite contrastée poursuite du traitement ...
  1319. imOpc=Image.open(self.repTampon+'tmp_gds486fsf68q2wx5k7u1oop.png')
  1320. # Conversion en RGBA pour pouvoir compositer ...
  1321. imOpc.convert('RGBA')
  1322.  
  1323. # Partie finale --- Compositing entre les traits de la partie 1 et couleurs de partie 2 -
  1324. # Attention il s'agit bien de l'image tampon: tmp_gds568ec4u5hg53g7s9m4rt.png
  1325. # C'est l'image qui contient les traits noirs (contours des objets)
  1326. # Traits noirs + le fond blanc a été remplacé par un fond transparent
  1327. imFondTransp=Image.open(self.repTampon+'tmp_gds568ec4u5hg53g7s9m4rt.png')
  1328. # Compositing (traitement final)
  1329. compoContCoul=Image.composite(imFondTransp, imOpc, imFondTransp)
  1330.  
  1331. # Sauvegarde
  1332. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  1333. compoContCoul.save(self.cheminCourantSauv)
  1334.  
  1335. # Purge des fichiers dans le rep tampon
  1336. os.remove(self.repTampon+'tmp_gds568ec4u5hg53g7s9m4rt.png')
  1337. os.remove(self.repTampon+'tmp_gds89gfdt39xfg6d9qxx1f.png')
  1338. os.remove(self.repTampon+'tmp_gds486fsf68q2wx5k7u1oop.png')
  1339.  
  1340. # Fin
  1341. if not self.opReccurApresApp(): return
  1342. self.j += 1
  1343.  
  1344.  
  1345. def appliquerNegatif(self):
  1346. """ Negatif: inverse les couleurs (ou les valeurs en cas de conversion en noir et blanc) """
  1347. for self.j in self.listeIndex:
  1348. # Récupération de l'index et l'entrée du combo de sélection
  1349. indexCombo = self.listeComboReglage[self.i][3].combo.currentIndex()
  1350. entreeCombo = str(self.listeComboReglage[self.i][3].combo.itemData(indexCombo).toStringList()[0])
  1351. # Ouverture des images
  1352. obImg = Image.open(self.listeImgSource[self.j])
  1353. if entreeCombo=='negatif_couleur':
  1354. negatif = ImageOps.invert(obImg)
  1355. elif entreeCombo=='negatif_n_et_b':
  1356. obImg = obImg.convert("L")
  1357. negatif = ImageOps.invert(obImg)
  1358. # Sauvegarde
  1359. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext ##
  1360. negatif.save(self.cheminCourantSauv)
  1361. # Fin
  1362. if not self.opReccurApresApp(): return
  1363. self.j += 1
  1364.  
  1365.  
  1366. def appliquerEncadrePhoto(self):
  1367. """ Encadrement photographique: appose un cadre autour des images """
  1368. for self.j in self.listeIndex:
  1369. # Récupération de l'index et l'entrée du combo de sélection
  1370. indexCombo = self.listeComboReglage[self.i][3].combo.currentIndex()
  1371. entreeCombo = str(self.listeComboReglage[self.i][3].combo.itemData(indexCombo).toStringList()[0])
  1372. # Ouverture des images
  1373. obImg = Image.open(self.listeImgSource[self.j])
  1374. if entreeCombo=='noir': couleur = (0, 0, 0)
  1375. elif entreeCombo=='gris': couleur = (128, 128, 128)
  1376. elif entreeCombo=='blanc': couleur = (255, 255, 255)
  1377. elif entreeCombo=='rouge': couleur = (255, 0, 0)
  1378. elif entreeCombo=='vert': couleur = (0, 255, 0)
  1379. elif entreeCombo=='bleu': couleur = (0, 0, 255)
  1380. elif entreeCombo=='jaune': couleur = (255, 255, 0)
  1381. # Application du filtre
  1382. cadre = ImageOps.expand(obImg, 40, couleur)
  1383. # Sauvegarde
  1384. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  1385. cadre.save(self.cheminCourantSauv)
  1386. # Fin
  1387. if not self.opReccurApresApp(): return
  1388. self.j += 1
  1389.  
  1390.  
  1391. def appliquerOmbreEtLumALaCouleur(self):
  1392. """ Ombre et lumière à la couleur (un espèce de seuillage mais avec des couleurs) """
  1393. # Récup de l'index du filtre
  1394. i=self.comboReglage.currentIndex()
  1395. ll=[]
  1396. for k in range(4):
  1397. for l in range(2):
  1398. ll.append(self.listeComboReglage[i][3].spin[k][l].value())
  1399. lValCoul=[ll[0], ll[2], ll[4], ll[6], ll[1], ll[3], ll[5], ll[7]]
  1400. # Boucle principale
  1401. for self.j in self.listeIndex:
  1402. # Ouverture des images
  1403. obImg = Image.open(self.listeImgSource[self.j])
  1404. # Conversion et sauvegarde en niveaux de gris
  1405. imageNDG = obImg.convert("L")
  1406. # Recup dimensions de l'image
  1407. wSeuil, hSeuil = imageNDG.size
  1408. # Filtre egalisateur pour renforcer les zones claires et les zones foncées
  1409. egaliseNDG_Seuil = ImageOps.equalize(imageNDG)
  1410. # Creation d'une nouvelle image
  1411. nouvImgNDG_Seuil = Image.new("L", (wSeuil, hSeuil))
  1412. # Insertion data ds nouvImgNDG_Seuil
  1413. nouvImgNDG_Seuil.putdata(egaliseNDG_Seuil.getdata())
  1414. # Récup des données contenues ds l'image et mises dans un tableau par Numpy
  1415. dataNDG_Seuil=array(nouvImgNDG_Seuil)#.reshape(wSeuil*hSeuil, 3)
  1416. # Aplatissement du tableau pour traitement
  1417. aplatNDG_Seuil=dataNDG_Seuil.flat
  1418. # Condition: (apres parcours de chaque element du tableau)
  1419. # ==> correspond en python classique a :
  1420. # if aplatNDG_Seuil>=spin1 and aplatNDG_Seuil<=spin2:
  1421. # Les pixels blancs seront placés ici.
  1422. condSeuil=(aplatNDG_Seuil>=128)&(aplatNDG_Seuil<=255)
  1423. # Selon la condition, remplacement de chaque element/pixel
  1424. # soit par 0 --> noir, soit par 255 --> blanc .
  1425. idSeuil=where(condSeuil, 0, 255)
  1426. # Insertion data et conversion en liste classique
  1427. transListe=idSeuil.tolist()
  1428. # Multiplication des données en 4 canaux et insertion en une liste de listes
  1429. # comme ceci: [[255, 255, 255, 255], [255, 255, 255, 255], [0, 0, 0, 0], ...]
  1430. # Le fait qu'il y ait 4 canaux est fait pour la gestion du canal alpha
  1431. quatreCanaux=[[parcTrans]*4 for parcTrans in transListe]
  1432. # Transformation de la liste de listes en liste de tuples
  1433. transTuple=[tuple(parcTuple) for parcTuple in quatreCanaux]
  1434. # Insertion des données (les blancs sont transformés en une couleur, les
  1435. # noir en une autre, couleurs choisies par l'utilisateur)
  1436. listeDonnees=[]
  1437. for parcDonnees in transTuple:
  1438. if parcDonnees==(255, 255, 255, 255):
  1439. parcDonnees=(lValCoul[0], lValCoul[1], lValCoul[2], lValCoul[3])
  1440. listeDonnees.append(parcDonnees)
  1441. elif parcDonnees==(0, 0, 0, 0):
  1442. parcDonnees=(lValCoul[4], lValCoul[5], lValCoul[6], lValCoul[7])
  1443. listeDonnees.append(parcDonnees)
  1444. # Creation d'une nouvelle image
  1445. nouvImg=Image.new("RGBA", (wSeuil, hSeuil))
  1446. # Insertion data ds nouvImgBinaire et conversion en liste classique
  1447. nouvImg.putdata(listeDonnees)
  1448. # Comme un canal alpha peut être appliqué à l'image sauvegardée, il vaut
  1449. # mieux sauvegarder avec une extension qui supporte la transparence
  1450. if self.ext not in ['.png', '.gif', '.tga']:
  1451. self.ext='.png'
  1452. # Sauvegarde
  1453. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  1454. nouvImg.save(self.cheminCourantSauv)
  1455. # Fin
  1456. if not self.opReccurApresApp(): return
  1457. self.j += 1
  1458.  
  1459.  
  1460. def appliquerRotationImage(self):
  1461. """ Rotation des images (90, 180 et 270 vers la gauche) """
  1462. for self.j in self.listeIndex:
  1463. # Récupération de l'index et l'entrée du combo de sélection
  1464. indexCombo = self.listeComboReglage[self.i][3].combo.currentIndex()
  1465. entreeCombo = str(self.listeComboReglage[self.i][3].combo.itemData(indexCombo).toStringList()[0])
  1466. # Ouverture des images
  1467. obImg = Image.open(self.listeImgSource[self.j])
  1468. #
  1469. if entreeCombo=='rot_img_90_gauche': rot = 90
  1470. elif entreeCombo=='rot_img_180_gauche': rot = 180
  1471. elif entreeCombo=='rot_img_270_gauche': rot = 270
  1472. # Application du filtre
  1473. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  1474. obImg.rotate(rot).save(self.cheminCourantSauv)
  1475. # Fin
  1476. if not self.opReccurApresApp(): return
  1477. self.j += 1
  1478.  
  1479.  
  1480. def appliquerImitationBd_2(self):
  1481. """ Dessin 11: imitation bande dessinée (avec intégration [un peu] de syntaxe Numpy) """
  1482. for self.j in self.listeIndex:
  1483. # Récup réglages ci-dessous
  1484. spin1 = self.listeComboReglage[self.i][3].spin.value() # intensité des traits
  1485. spin2 = str(self.listeComboReglage[self.i][3].spin2.value()) # flou des couleurs
  1486.  
  1487. # Partie 1 --- Travail avec l'image de fond (couleurs floutées) ------------------------- #
  1488.  
  1489. process = QProcess(self)
  1490.  
  1491. # Uniquement pour Linux et MacOSX
  1492. if os.name in ['posix', 'mac']:
  1493.  
  1494. process.start("convert -noise "+spin2+" -gamma 1.4 "+"\""+self.listeImgSource[self.j]+"\""+' '+"\""+self.repTampon+'tmp_gtyj58h6fdh2fyyw478105tu.png'+"\"")
  1495. if not process.waitForStarted(3000):
  1496. QMessageBox.warning(None, _(u"Erreur"), _(u"Bogue au lancement de la commande"))
  1497. process.waitForFinished(-1)
  1498.  
  1499. # Uniquement pour windows
  1500. elif os.name == 'nt':
  1501.  
  1502. # Attention ici dans la version windows ce n'est pas traité par un
  1503. # QProcess (comme sous Linux) mais directement avec os.system (car le
  1504. # QProcess avec la commande convert d'ImageMagick génère une erreur)
  1505. os.system(("convert -noise "+spin2+" -gamma 1.4 "+"\""+self.listeImgSource[self.j]+"\""+' '+"\""+self.repTampon+'tmp_gtyj58h6fdh2fyyw478105tu.png'+"\"").encode(locale.getdefaultlocale()[1]))
  1506.  
  1507. # --------------------------------------------------------------------------------------- #
  1508.  
  1509. # Partie 2 ------ Détection du contour des formes et traçage des futurs traits noirs ---- #
  1510.  
  1511. # Ouverture des images. Conversion et sauvegarde en niveaux de gris
  1512. obImg = Image.open(self.listeImgSource[self.j]).convert("L")
  1513. # Recup dimensions de l'image
  1514. w, h = obImg.size
  1515.  
  1516. # Kernel 5x5 Réduction du Bruit + ajout de la valeur de spin1 au centre de la matrice
  1517. imKernel = obImg.filter(ImageFilter.Kernel((5, 5), (-2, -2, -2, -2, -2, -1, -1, 0, 0, 0, 0, 0, spin1, 0, 0, 0, 0, 0, -1, -1, -2, -2, -2, -2, -2)))
  1518. imKernel.save(self.repTampon+'tmp_g9wxgfdg55t864vs156gmox4wse156sf.png', 'PNG')
  1519. # Ouverture de l'image temporaire
  1520. ouvImg = Image.open(self.repTampon+'tmp_g9wxgfdg55t864vs156gmox4wse156sf.png')
  1521. # Filtre egalisateur pour renforcer les zones claires et les zones foncées
  1522. egalise = ImageOps.equalize(ouvImg)
  1523. # Creation d'une nouvelle image
  1524. nouvImg = Image.new("L", (w, h))
  1525. # Insertion data ds nouvImg
  1526. nouvImg.putdata(egalise.getdata())
  1527. # Récup des données contenues ds l'image et mises dans un tableau par Numpy
  1528. data = array(nouvImg)
  1529. # Aplatissement du tableau pour traitement
  1530. aplat = data.flat
  1531. # Condition: (apres parcours de chaque element du tableau)
  1532. condition = (aplat>=1)&(aplat<=255)
  1533. # Selon la condition, remplacement de chaque element/pixel
  1534. # soit par 255 --> blanc, soit par 0 --> noir
  1535. idCond = where(condition, 255, 0)
  1536. # Creation d'une nouvelle image
  1537. nouvImgBinaire = Image.new("L", (w, h))
  1538. # Insertion data ds nouvImgBinaire et conversion en liste classique
  1539. nouvImgBinaire.putdata(idCond.tolist())
  1540. # Recup des donnees
  1541. listeAlpha_1=list(nouvImgBinaire.getdata())
  1542. # Creation de la liste newListRGBAbin
  1543. newListRGBAbin=[]
  1544. for parcListe in listeAlpha_1:
  1545. # Si on a des pixels blancs et transparents dans listeAlpha_1 alors on injecte
  1546. # des pixels blancs transparents mais ce coup-ci en mode RGBA .
  1547. if parcListe==255: newListRGBAbin.append((255, 255, 255, 0))
  1548. # (Autre) si on a des pixels noirs et opaques dans listeAlpha_1
  1549. # alors on injecte des pixels noirs opaques mais ce coup-ci en
  1550. # mode RGBA .
  1551. else: newListRGBAbin.append((0, 0, 0, 255))
  1552.  
  1553. # Creation d'une nouvelle image
  1554. nouvImgRGBA=Image.new("RGBA", (w, h))
  1555. # Insertion data ds nouvImgRGBA
  1556. nouvImgRGBA.putdata(newListRGBAbin)
  1557. # Sauvegarde image temporaire
  1558. nouvImgRGBA.save(self.repTampon+'tmp_g9wxgfdg55t864vs156gmox4wse156sf.png', 'PNG')
  1559.  
  1560. # --------------------------------------------------------------------------------------- #
  1561.  
  1562. # Partie finale --- Compositing entre les traits de la partie 1 et couleurs de partie 2 - #
  1563.  
  1564. # Ouverture de l'image de fond (couleurs floutées) et conversion en RGBA
  1565. imOpc=Image.open(self.repTampon+'tmp_gtyj58h6fdh2fyyw478105tu.png')
  1566. imOpc.convert('RGBA')
  1567. # Attention il s'agit bien de l'image tampon: tmp_g9wxgfdg55t864vs156gmox4wse156sf.png
  1568. # C'est l'image qui contient les traits noirs (contours des objets)
  1569. # Traits noirs + le fond blanc a été remplacé par un fond transparent
  1570. imFondTransp=Image.open(self.repTampon+'tmp_g9wxgfdg55t864vs156gmox4wse156sf.png')
  1571. # Compositing (traitement final)
  1572. compoContCoul=Image.composite(imFondTransp, imOpc, imFondTransp)
  1573.  
  1574. # Sauvegarde
  1575. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  1576. compoContCoul.save(self.cheminCourantSauv)
  1577.  
  1578. # Purge des fichiers dans le rep tampon
  1579. os.remove(self.repTampon+'tmp_gtyj58h6fdh2fyyw478105tu.png')
  1580. os.remove(self.repTampon+'tmp_g9wxgfdg55t864vs156gmox4wse156sf.png')
  1581.  
  1582. # Fin
  1583. if not self.opReccurApresApp(): return
  1584. self.j += 1
  1585.  
  1586.  
  1587. def appliquerLaplacien_1(self):
  1588. """ Dessin 12: laplacien """
  1589. for self.j in self.listeIndex:
  1590. # Récupération de l'index et l'entrée du combo de sélection
  1591. indexCombo = self.listeComboReglage[self.i][3].combo.currentIndex()
  1592. entreeCombo = str(self.listeComboReglage[self.i][3].combo.itemData(indexCombo).toStringList()[0])
  1593. # Application du filtre
  1594. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  1595. if entreeCombo=="laplacien_1_noir_et_blanc":
  1596. # Conversion de l'image en niveaux de gris
  1597. obImg = Image.open(self.listeImgSource[self.j]).convert('L')
  1598. elif entreeCombo=="laplacien_1_couleur":
  1599. # Conversion de l'image en RGB
  1600. obImg = Image.open(self.listeImgSource[self.j]).convert('RGB')
  1601. sizeKern5x5=(5, 5)
  1602. kernLaplacien_1 = (-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 24, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
  1603. imKernelLaplacien_1 = obImg.filter(ImageFilter.Kernel(sizeKern5x5, kernLaplacien_1)).save(self.cheminCourantSauv)
  1604. # Fin
  1605. if not self.opReccurApresApp(): return
  1606. self.j += 1
  1607.  
  1608.  
  1609. def appliquerContourEtCouleur(self):
  1610. """ Ce filtre est le mélange d'une partie (pour les traits de contour) du filtre
  1611. Dessin 10: imitation bande dessinée et du filtre Ombre et lumière à la couleur """
  1612.  
  1613. for self.j in self.listeIndex:
  1614.  
  1615. # Récup réglages ci-dessous
  1616. #
  1617. #spin1 = self.listeComboReglage[self.i][3].spin1.value() # intensité des traits
  1618. #
  1619. # Récup de l'index du filtre
  1620. i=self.comboReglage.currentIndex()
  1621. # Récup des données --> couleurs pour l'ombre, couleurs pour la lumière
  1622. ll=[]
  1623. for k in range(4):
  1624. for l in range(2):
  1625. ll.append(self.listeComboReglage[i][3].spin[k][l].value())
  1626. lValCoul=[ll[0], ll[2], ll[4], ll[6], ll[1], ll[3], ll[5], ll[7]]
  1627. #
  1628. # Récuperération de la couleur du trait de contour
  1629. coul_rouge_trait = self.listeComboReglage[i][3].spin[0][2].value() # rouge
  1630. coul_vert_trait = self.listeComboReglage[i][3].spin[1][2].value() # vert
  1631. coul_bleu_trait = self.listeComboReglage[i][3].spin[2][2].value() # bleu
  1632. transparence_trait = self.listeComboReglage[i][3].spin[3][2].value() # transparence
  1633. # Valeur de l'intensité du trait
  1634. val_intens_trait = self.listeComboReglage[i][3].spin[len(self.listeComboReglage[i][3].spin)-1].value()
  1635.  
  1636. # -------------------------------------------------------------------
  1637. # Partie trait/contour
  1638. # -------------------------------------------------------------------
  1639. # Ouverture des images. Conversion et sauvegarde en niveaux de gris
  1640. obImg_1 = Image.open(self.listeImgSource[self.j]).convert("L")
  1641. # Recup dimensions de l'image
  1642. w, h = obImg_1.size
  1643.  
  1644. # Détection du contour des formes et traçage des futurs traits noirs -
  1645. # Kernel 5x5 Réduction du Bruit + ajout de la valeur de spin1 au centre de la matrice
  1646. imKernel = obImg_1.filter(ImageFilter.Kernel((5, 5), (-2, -2, -2, -2, -2, -1, -1, 0, 0, 0, 0, 0, val_intens_trait, 0, 0, 0, 0, 0, -1, -1, -2, -2, -2, -2, -2)))
  1647. imKernel.save(self.repTampon+'tmp_df7f684qf466wrt84fk8ffs74doqsf48g.png', 'PNG')
  1648. # Ouverture de l'image temporaire
  1649. ouvImg = Image.open(self.repTampon+'tmp_df7f684qf466wrt84fk8ffs74doqsf48g.png')
  1650. # Filtre egalisateur pour renforcer les zones claires et les zones foncées
  1651. egalise = ImageOps.equalize(ouvImg)
  1652. # Creation d'une nouvelle image
  1653. nouvImg = Image.new("L", (w, h))
  1654. # Insertion data ds nouvImg
  1655. nouvImg.putdata(egalise.getdata())
  1656. # Récup des données contenues ds l'image et mises dans un tableau par Numpy
  1657. data = array(nouvImg)
  1658. # Aplatissement du tableau pour traitement
  1659. aplat = data.flat
  1660. # Condition: (apres parcours de chaque element du tableau)
  1661. condition = (aplat>=1)&(aplat<=255)
  1662. # Selon la condition, remplacement de chaque element/pixel
  1663. # soit par 255 --> blanc, soit par 0 --> noir
  1664. idCond = where(condition, 255, 0)
  1665. # Creation d'une nouvelle image
  1666. nouvImgBinaire = Image.new("L", (w, h))
  1667. # Insertion data ds nouvImgBinaire et conversion en liste classique
  1668. nouvImgBinaire.putdata(idCond.tolist())
  1669. # Recup des donnees
  1670. listeAlpha_1=list(nouvImgBinaire.getdata())
  1671. # Creation de la liste newListRGBAbin
  1672. newListRGBAbin=[]
  1673. for parcListe in listeAlpha_1:
  1674. # Si on a des pixels blancs et transparents dans listeAlpha_1 alors on injecte
  1675. # des pixels blancs transparents mais ce coup-ci en mode RGBA .
  1676. if parcListe==255: newListRGBAbin.append((255, 255, 255, 0))
  1677. # (Autre) si on a des pixels noirs et opaques dans listeAlpha_1
  1678. # alors on injecte des pixels noirs opaques mais ce coup-ci en
  1679. # mode RGBA.
  1680. else: newListRGBAbin.append((coul_rouge_trait, coul_vert_trait, coul_bleu_trait, transparence_trait))
  1681.  
  1682. # Creation d'une nouvelle image
  1683. nouvImgRGBA=Image.new("RGBA", (w, h))
  1684. # Insertion data ds nouvImgRGBA
  1685. nouvImgRGBA.putdata(newListRGBAbin)
  1686. # Sauvegarde image temporaire
  1687. nouvImgRGBA.save(self.repTampon+'tmp_df7f684qf466wrt84fk8ffs74doqsf48g.png', 'PNG')
  1688. # -------------------------------------------------------------------
  1689.  
  1690. # -------------------------------------------------------------------
  1691. # Partie couleur (ombre et lumière)
  1692. # -------------------------------------------------------------------
  1693. # Ouverture des images
  1694. obImg_2 = Image.open(self.listeImgSource[self.j])
  1695. # Conversion et sauvegarde en niveaux de gris
  1696. imageNDG = obImg_2.convert("L")
  1697. # Recup dimensions de l'image
  1698. wSeuil, hSeuil = imageNDG.size
  1699. # Filtre egalisateur pour renforcer les zones claires et les zones foncées
  1700. egaliseNDG_Seuil = ImageOps.equalize(imageNDG)
  1701. # Creation d'une nouvelle image
  1702. nouvImgNDG_Seuil = Image.new("L", (wSeuil, hSeuil))
  1703. # Insertion data ds nouvImgNDG_Seuil
  1704. nouvImgNDG_Seuil.putdata(egaliseNDG_Seuil.getdata())
  1705. # Récup des données contenues ds l'image et mises dans un tableau par Numpy
  1706. dataNDG_Seuil=array(nouvImgNDG_Seuil)#.reshape(wSeuil*hSeuil, 3)
  1707. # Aplatissement du tableau pour traitement
  1708. aplatNDG_Seuil=dataNDG_Seuil.flat
  1709. # Condition: (apres parcours de chaque element du tableau)
  1710. # ==> correspond en python classique a :
  1711. # if aplatNDG_Seuil>=spin1 and aplatNDG_Seuil<=spin2:
  1712. # Les pixels blancs seront placés ici.
  1713. condSeuil=(aplatNDG_Seuil>=128)&(aplatNDG_Seuil<=255)
  1714. # Selon la condition, remplacement de chaque element/pixel
  1715. # soit par 0 --> noir, soit par 255 --> blanc .
  1716. idSeuil=where(condSeuil, 0, 255)
  1717. # Insertion data et conversion en liste classique
  1718. transListe=idSeuil.tolist()
  1719. # Multiplication des données en 4 canaux et insertion en une liste de listes
  1720. # comme ceci: [[255, 255, 255, 255], [255, 255, 255, 255], [0, 0, 0, 0], ...]
  1721. # Le fait qu'il y ait 4 canaux est fait pour la gestion du canal alpha
  1722. quatreCanaux=[[parcTrans]*4 for parcTrans in transListe]
  1723. # Transformation de la liste de listes en liste de tuples
  1724. transTuple=[tuple(parcTuple) for parcTuple in quatreCanaux]
  1725. # Insertion des données (les blancs sont transformés en une couleur, les
  1726. # noir en une autre, couleurs choisies par l'utilisateur)
  1727. listeDonnees=[]
  1728. for parcDonnees in transTuple:
  1729. if parcDonnees==(255, 255, 255, 255):
  1730. parcDonnees=(lValCoul[0], lValCoul[1], lValCoul[2], lValCoul[3])
  1731. listeDonnees.append(parcDonnees)
  1732. elif parcDonnees==(0, 0, 0, 0):
  1733. parcDonnees=(lValCoul[4], lValCoul[5], lValCoul[6], lValCoul[7])
  1734. listeDonnees.append(parcDonnees)
  1735. # Creation d'une nouvelle image
  1736. nouvImg=Image.new("RGBA", (wSeuil, hSeuil))
  1737. # Insertion data ds nouvImgBinaire et conversion en liste classique
  1738. nouvImg.putdata(listeDonnees)
  1739. nouvImg.save(self.repTampon+'tmp_gg48rg68aaafgabw686u8sdv8s8f5w9d.png', 'PNG')
  1740. # Comme un canal alpha peut être appliqué à l'image sauvegardée, il vaut
  1741. # mieux sauvegarder avec une extension qui supporte la transparence
  1742. if self.ext not in ['.png', '.gif', '.tga']:
  1743. self.ext='.png'
  1744. # -------------------------------------------------------------------
  1745.  
  1746. # -------------------------------------------------------------------
  1747. # Compositing
  1748. # -------------------------------------------------------------------
  1749. imFondTransp=Image.open(self.repTampon+'tmp_df7f684qf466wrt84fk8ffs74doqsf48g.png')
  1750. compoContCoul=Image.composite(imFondTransp, nouvImg, imFondTransp)
  1751. # -------------------------------------------------------------------
  1752.  
  1753. # Sauvegarde
  1754. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  1755. compoContCoul.save(self.cheminCourantSauv)
  1756.  
  1757. os.remove(self.repTampon+'tmp_df7f684qf466wrt84fk8ffs74doqsf48g.png')
  1758. os.remove(self.repTampon+'tmp_gg48rg68aaafgabw686u8sdv8s8f5w9d.png')
  1759.  
  1760. # Fin
  1761. if not self.opReccurApresApp(): return
  1762. self.j += 1
  1763.  
  1764.  
  1765. def arretProgression(self):
  1766. """Si le filtre appliqué est 100 % shell, alors la conversion est immédiatement stoppée après un clic sur le bouton de la QProgessDialog. Pas la peine d'attendre la fin de la conversion de l'image en cours comme pour les autres types de filtres."""
  1767. if self.listeComboReglage[self.i][1] in self.filtresPython: return
  1768. self.terminerFiltreShell = 1
  1769. self.process.kill()
  1770. if len(self.listeImgDestin)!=0:
  1771. self.conversionImg = 1
  1772. self.logFinal(self.listeComboReglage[self.i][0])
  1773. self.tabwidget.setCurrentIndex(self.indexTabImgInfos)
  1774. else: # Onglet de log -> on remet les infos de départ
  1775. self.zoneAffichInfosImg.setText(self.infosImgTitre[0]+"\n".join(self.listeImgSource))
  1776.  
  1777.  
  1778. def finConversion(self, statutDeSortie):
  1779. """Choses à faire à la fin de l'encodage d'une image quand le filtre sélectionné est constitué d'une seule commande shell"""
  1780.  
  1781. if statutDeSortie==1:
  1782. print "Problème lors de la conversion!"
  1783. messageAide=QMessageBox(self)
  1784. messageAide.setText(_(u"Une erreur s'est produite durant la conversion"))
  1785. messageAide.setWindowTitle(_(u"Aide"))
  1786. messageAide.setIcon(QMessageBox.Warning)
  1787. messageAide.exec_()
  1788. self.logFinal(self.listeComboReglage[self.i][0])
  1789. self.tabwidget.setCurrentIndex(self.indexTabImgInfos)
  1790. return
  1791.  
  1792. # On ne continue pas si l'utilisateur l'a décidé
  1793. elif self.terminerFiltreShell: return
  1794.  
  1795. # On passe à l'image suivante s'il en reste
  1796. elif self.opReccurApresApp():
  1797. self.appliquer()
  1798.  
  1799.  
  1800. def opReccurApresApp(self):
  1801. """Opérations à effectuer après chaque appel du moteur."""
  1802. if self.listeComboReglage[self.i][1] in self.filtresPython:
  1803. modulePython = 1 # conversion python (+ shell pour certains filtres)
  1804. else: modulePython = 0 # conversion 100% shell
  1805.  
  1806. self.listeImgDestin.append(self.cheminCourantSauv)
  1807. pourCent=int((float(self.j+1)/self.nbrImg)*100)
  1808.  
  1809. self.progress.setValue(pourCent)
  1810. #!!!Rafraichissement indispensable pour la transmission immédiate du signal QProgressDialog().wasCanceled
  1811. if modulePython: QApplication.processEvents()
  1812.  
  1813. # Incrémentation de l'indice du fichier source pour une conversion 100% commande shell
  1814. if not modulePython: self.j += 1
  1815.  
  1816. # Opérations de fin de conversion
  1817. if pourCent==100:
  1818. # Condition à respecter pour qu'un affichage d'une nouvelle image ait lieu dans l'onglet "Images après traitement"
  1819. self.conversionImg = 1
  1820. # Boite de dialogue d'information
  1821. messageAide=QMessageBox(self)
  1822. messageAide.setText(_(u"Le filtre a été appliqué avec succès!"))
  1823. messageAide.setWindowTitle(self.listeComboReglage[self.i][0])
  1824. messageAide.setIcon(QMessageBox.Information)
  1825. messageAide.exec_()
  1826. # Mise-à-jour du log
  1827. self.logFinal(self.listeComboReglage[self.i][0])
  1828. # Changement d'onglet et fonctions associées
  1829. self.metaFctTab(self.indexTabImgDestin)
  1830. return 0
  1831.  
  1832. # Opérations à faire lors de l'arrêt de la conversion suite au clic sur le bouton annuler de la barre de progression
  1833. elif self.progress.wasCanceled():
  1834. if modulePython:
  1835. # Condition à respecter pour qu'un affichage d'une nouvelle image ait lieu dans l'onglet "Images après traitement"
  1836. self.conversionImg = 1
  1837. # Mise-à-jour du log
  1838. self.logFinal(self.listeComboReglage[self.i][0])
  1839. # Affichage de l'onglet d'infos
  1840. self.tabwidget.setCurrentIndex(self.indexTabImgInfos)
  1841. return 0
  1842.  
  1843. return 1
  1844.  
  1845.  
  1846. def visu_1ere_img(self):
  1847. """Fonction pour faire une simulation de rendu (avec les réglages opérés dans l'onglet Réglages)
  1848. et ce à partir du bouton Aperçu à partir de la première image, toujours dans l'onglet Réglages"""
  1849.  
  1850. file = self.afficheurImgSource.getFile()
  1851. if not file:
  1852. return
  1853.  
  1854. self.listeImgSource=[file] # changer la suite
  1855. # et virer les crochets de cette liste
  1856.  
  1857. # Récup de l'index du filtre
  1858. i=self.comboReglage.currentIndex()
  1859.  
  1860. self.cheminCourantSauv = self.repTampon+'image_visu_'+string.zfill(1, 6)+'.png'
  1861.  
  1862. #------------------------------
  1863. # Filtres 100% commande shell
  1864. #------------------------------
  1865.  
  1866. #------------------------------
  1867. # Gestion par ImagMagick
  1868. #------------------------------
  1869.  
  1870. # locale est importé ici
  1871. import locale
  1872.  
  1873. if self.listeComboReglage[i][1] in ['sepia','traits_noirs','peu_couleur','peinture_huile',\
  1874. 'gamma','fonce_clair','peinture_eau','bas_relief']:
  1875. spin = str(self.listeComboReglage[i][3].spin.value())
  1876. if self.listeComboReglage[i][1]=='sepia':
  1877. os.system(("convert -sepia-tone "+spin+"% -monitor "+"\""+self.listeImgSource[0]+"\""+' '+"\""+self.cheminCourantSauv+"\"").encode(locale.getdefaultlocale()[1]))
  1878. elif self.listeComboReglage[i][1]=='traits_noirs':
  1879. os.system(("convert -charcoal "+spin+" -monochrome "+"\""+self.listeImgSource[0]+"\""+' '+"\""+self.cheminCourantSauv+"\"").encode(locale.getdefaultlocale()[1]))
  1880. elif self.listeComboReglage[i][1]=='peu_couleur':
  1881. os.system(("convert -enhance -equalize -edge "+spin+" -colorize 6,12,20 "+"\""+self.listeImgSource[0]+"\""+' '+"\""+self.cheminCourantSauv+"\"").encode(locale.getdefaultlocale()[1]))
  1882. elif self.listeComboReglage[i][1]=='peinture_huile':
  1883. os.system(("convert -paint "+spin+' '+"\""+self.listeImgSource[0]+"\""+' '+"\""+self.cheminCourantSauv+"\"").encode(locale.getdefaultlocale()[1]))
  1884. elif self.listeComboReglage[i][1]=='gamma':
  1885. os.system(("convert -gamma "+spin+' '+"\""+self.listeImgSource[0]+"\""+' '+"\""+self.cheminCourantSauv+"\"").encode(locale.getdefaultlocale()[1]))
  1886. elif self.listeComboReglage[i][1]=='fonce_clair':
  1887. os.system(("convert -modulate "+spin+' '+"\""+self.listeImgSource[0]+"\""+' '+"\""+self.cheminCourantSauv+"\"").encode(locale.getdefaultlocale()[1]))
  1888. elif self.listeComboReglage[i][1]=='peinture_eau':
  1889. os.system(("convert -noise "+spin+" -gamma 1.4 "+"\""+self.listeImgSource[0]+"\""+' '+"\""+self.cheminCourantSauv+"\"").encode(locale.getdefaultlocale()[1]))
  1890. elif self.listeComboReglage[i][1]=='bas_relief':
  1891. os.system(("convert -paint "+spin+" -shade 120x45 "+"\""+self.listeImgSource[0]+"\""+' '+"\""+self.cheminCourantSauv+"\"").encode(locale.getdefaultlocale()[1]))
  1892.  
  1893. elif self.listeComboReglage[i][1] in ['crayon_papier_1','floutage','trait_couleur_fond_noir']:
  1894. spin1 = str(self.listeComboReglage[i][3].spin1.value())
  1895. spin2 = str(self.listeComboReglage[i][3].spin2.value())
  1896. if self.listeComboReglage[i][1]=='crayon_papier_1':
  1897. os.system(("convert -spread "+spin2+" -charcoal "+spin1+' '+"\""+self.listeImgSource[0]+"\""+' '+"\""+self.cheminCourantSauv+"\"").encode(locale.getdefaultlocale()[1]))
  1898. elif self.listeComboReglage[i][1]=='floutage':
  1899. os.system(("convert -blur "+spin1+'%'+'x'+spin2+"% "+"\""+self.listeImgSource[0]+"\""+' '+"\""+self.cheminCourantSauv+"\"").encode(locale.getdefaultlocale()[1]))
  1900. elif self.listeComboReglage[i][1]=='trait_couleur_fond_noir':
  1901. os.system(("convert -median "+spin1+" -edge "+spin2+' '+"\""+self.listeImgSource[0]+"\""+' '+"\""+self.cheminCourantSauv+"\"").encode(locale.getdefaultlocale()[1]))
  1902.  
  1903. elif self.listeComboReglage[i][1]=='monochrome':
  1904. os.system(("convert -monochrome "+"\""+self.listeImgSource[0]+"\""+' '+"\""+self.cheminCourantSauv+"\"").encode(locale.getdefaultlocale()[1]))
  1905.  
  1906. elif self.listeComboReglage[i][1]=='pointillisme':
  1907. indexCombo = self.listeComboReglage[i][3].combo.currentIndex()
  1908. entreeCombo = str(self.listeComboReglage[i][3].combo.itemData(indexCombo).toStringList()[0])
  1909. os.system(("convert +noise "+entreeCombo+' '+"\""+self.listeImgSource[0]+"\""+' '+"\""+self.cheminCourantSauv+"\"").encode(locale.getdefaultlocale()[1]))
  1910. '''
  1911. elif self.listeComboReglage[i][1]=='craie_blanche':
  1912. os.system("convert -blur 2x2 -fx 'log(r*60*pi)' -edge 0.1 -blur 2x2 "+"\""+self.listeImgSource[0]+"\""+' '+"\""+self.cheminCourantSauv+"\"")
  1913. '''
  1914.  
  1915. #------------------------------
  1916. # Gestion par G'MIC
  1917. #------------------------------
  1918.  
  1919. ### ATTENTION ######################################################################
  1920. # "\"" a été remplacé par "\\\"" car G'MIC demande une syntaxe du style:
  1921. # gmic \"mon nom de fichier avec espace.jpg\" ... pour pouvoir traiter des fichiers
  1922. # avec des espaces dans son nom
  1923. ####################################################################################
  1924.  
  1925.  
  1926. ########Rajout le 4/02/2011 par LUCAS Thomas et CABANA Antoine##################
  1927. if self.listeComboReglage[i][1] in ['dessin_13_couleur', 'crayon_papier_2', 'polaroid', 'vieille_photo', 'oeilleton', 'cubisme_analytique', 'andy_warhol', 'expressionnisme', 'correct_yeux_rouges', 'solarisation', 'bull_en_tableau', 'la_planete_1', 'vision_thermique','enflamme','predator']:
  1928. ################################################################################
  1929.  
  1930. if self.listeComboReglage[i][1]=='dessin_13_couleur':
  1931. #################################################
  1932. # Pour Dessin 13: couleur:
  1933. # ------------------------
  1934. # spin1 --> Amplitude
  1935. #################################################
  1936. spin1 = self.listeComboReglage[i][3].spin1.value()
  1937. spin1 = str(spin1/100)
  1938. os.system(("gmic "+"\\\""+self.listeImgSource[0]+"\\\""+" -drawing "+spin1+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  1939. elif self.listeComboReglage[i][1]=='crayon_papier_2':
  1940. #################################################
  1941. # Pour Dessin 14: crayon à papier 2:
  1942. # ----------------------------------
  1943. # spin1 --> Taille
  1944. #################################################
  1945. spin1 = self.listeComboReglage[i][3].spin1.value()
  1946. spin1 = str(spin1/10)
  1947. os.system(("gmic "+"\\\""+self.listeImgSource[0]+"\\\""+" -pencilbw "+spin1+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  1948. elif self.listeComboReglage[i][1]=='correct_yeux_rouges':
  1949. #################################################
  1950. # Pour Correction des yeux rouges:
  1951. # --------------------------------
  1952. # spin1 --> Seuil des couleurs
  1953. # spin2 --> Lissage
  1954. # spin3 --> Atténuation
  1955. #################################################
  1956. spin1 = self.listeComboReglage[i][3].spin1.value()
  1957. # Si spin1 réglé sur 1 en fait spin vaut 0
  1958. if spin1 == 1: spin1 = 0
  1959. # Si la valeur de spin1 est supérieure à 1 on retranche 1
  1960. if spin1 > 1: spin1 = spin1 - 1
  1961. spin1 = str(spin1)
  1962. spin2 = self.listeComboReglage[i][3].spin2.value()
  1963. spin2 = str(spin2/10.0)
  1964. spin3 = self.listeComboReglage[i][3].spin3.value()
  1965. spin3 = str(spin3/10.0)
  1966. os.system(("gmic "+"\\\""+self.listeImgSource[0]+"\\\""+" -red_eye "+spin1+','+spin2+','+spin3+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  1967. elif self.listeComboReglage[i][1]=='solarisation':
  1968. os.system(("gmic "+"\\\""+self.listeImgSource[0]+"\\\""+" -solarize -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  1969. elif self.listeComboReglage[i][1]=='oeilleton':
  1970. #################################################
  1971. # Pour Oeilleton:
  1972. # ---------------
  1973. # spin1 --> Position sur la largeur
  1974. # spin2 --> Position sur la hauteur
  1975. # spin3 --> Rayon
  1976. # spin4 --> Amplitude
  1977. #################################################
  1978. spin1 = str(self.listeComboReglage[i][3].spin1.value())
  1979. spin2 = str(self.listeComboReglage[i][3].spin2.value())
  1980. spin3 = str(self.listeComboReglage[i][3].spin3.value())
  1981. spin4 = str(self.listeComboReglage[i][3].spin4.value())
  1982. os.system(("gmic "+"\\\""+self.listeImgSource[0]+"\\\""+" -fish_eye "+spin1+','+spin2+','+spin3+','+spin4+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  1983. elif self.listeComboReglage[i][1]=='polaroid':
  1984. #################################################
  1985. # Pour Polaroïd:
  1986. # --------------
  1987. # spin1 --> Taille de la bordure
  1988. # spin2 --> Taille en largeur pour l'ombre
  1989. # spin3 --> Taille en hauteur pour l'ombre
  1990. # spin4 --> Rotation (en degrés) de la photo
  1991. #################################################
  1992. spin1 = str(self.listeComboReglage[i][3].spin1.value())
  1993. spin2 = str(self.listeComboReglage[i][3].spin2.value())
  1994. spin3 = str(self.listeComboReglage[i][3].spin3.value())
  1995. spin4 = str(self.listeComboReglage[i][3].spin4.value())
  1996. os.system(("gmic "+"\\\""+self.listeImgSource[0]+"\\\""+" -polaroid "+spin1+" -drop_shadow "+spin2+','+spin3+" -rotate "+spin4+",1 -drgba -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  1997. elif self.listeComboReglage[i][1]=='vieille_photo':
  1998. #################################################
  1999. # Pour Vieille photo:
  2000. # -------------------
  2001. # spin1 --> Taille en largeur pour l'ombre
  2002. # spin2 --> Taille en hauteur pour l'ombre
  2003. # spin3 --> Rotation (en degrés) de la photo
  2004. #################################################
  2005. spin1 = str(self.listeComboReglage[i][3].spin1.value())
  2006. spin2 = str(self.listeComboReglage[i][3].spin2.value())
  2007. spin3 = str(self.listeComboReglage[i][3].spin3.value())
  2008. os.system(("gmic "+"\\\""+self.listeImgSource[0]+"\\\""+" -old_photo -drop_shadow "+spin1+','+spin2+" -rotate "+spin3+",1 -drgba -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  2009. elif self.listeComboReglage[i][1]=='cubisme_analytique':
  2010. #################################################
  2011. # Pour Cubisme analytique:
  2012. # ------------------------
  2013. # spin1 --> Itération
  2014. # spin2 --> Taille de bloc
  2015. # spin3 --> Angle
  2016. #################################################
  2017. spin1 = str(self.listeComboReglage[i][3].spin1.value())
  2018. spin2 = str(self.listeComboReglage[i][3].spin2.value())
  2019. spin3 = str(self.listeComboReglage[i][3].spin3.value())
  2020. #self.process = EkdProcess(("gmic "+"\\\""+self.listeImgSource[0]+"\\\""+" -cubism "+spin1+','+spin2+','+spin3+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]), output = None, stdinput = None)
  2021. os.system(("gmic "+"\\\""+self.listeImgSource[0]+"\\\""+" -cubism "+spin1+','+spin2+','+spin3+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  2022. elif self.listeComboReglage[i][1]=='andy_warhol':
  2023. #################################################
  2024. # Pour Andy Warhol:
  2025. # -----------------
  2026. # spin1 --> Nombre d'images par ligne
  2027. # spin2 --> Nombre d'images par colonne
  2028. # spin3 --> Lissage
  2029. # spin4 --> Couleur
  2030. #################################################
  2031. spin1 = str(self.listeComboReglage[i][3].spin1.value())
  2032. spin2 = str(self.listeComboReglage[i][3].spin2.value())
  2033. spin3 = str(self.listeComboReglage[i][3].spin3.value())
  2034. spin4 = str(self.listeComboReglage[i][3].spin4.value())
  2035. os.system(("gmic "+"\\\""+self.listeImgSource[0]+"\\\""+" -warhol "+spin1+','+spin2+','+spin3+','+spin4+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  2036. elif self.listeComboReglage[i][1]=='expressionnisme':
  2037. #################################################
  2038. # Pour Expressionnisme:
  2039. # ---------------------
  2040. # spin1 --> Abstraction
  2041. # spin2 --> Lissage
  2042. # spin3 --> Couleur
  2043. #################################################
  2044. spin1 = str(self.listeComboReglage[i][3].spin1.value())
  2045. spin2 = self.listeComboReglage[i][3].spin2.value()
  2046. spin2 = str(spin2/100)
  2047. spin3 = self.listeComboReglage[i][3].spin3.value()
  2048. spin3 = str(spin3/100)
  2049. os.system(("gmic "+"\\\""+self.listeImgSource[0]+"\\\""+" -gimp_painting "+spin1+','+spin2+','+spin3+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  2050. elif self.listeComboReglage[i][1]=='bull_en_tableau':
  2051. #################################################
  2052. # Pour Bulles en tableau:
  2053. # -----------------------
  2054. # spin1 --> Résolution en X
  2055. # spin2 --> Résolution en Y
  2056. # spin3 --> Rayon de la bulle
  2057. # spin4 --> Bulles par ligne
  2058. # spin5 --> Bulles par colonne
  2059. # spin6 --> Largeur de la bordure
  2060. # spin7 --> Hauteur de la bordure
  2061. # spin8 --> Largeur finale de l'image
  2062. # spin9 --> Hauteur finale de l'image
  2063. #################################################
  2064. spin1 = str(self.listeComboReglage[i][3].spin1.value())
  2065. spin2 = str(self.listeComboReglage[i][3].spin2.value())
  2066. spin3 = str(self.listeComboReglage[i][3].spin3.value())
  2067. spin4 = str(self.listeComboReglage[i][3].spin4.value())
  2068. spin5 = str(self.listeComboReglage[i][3].spin5.value())
  2069. spin6 = str(self.listeComboReglage[i][3].spin6.value())
  2070. spin7 = str(self.listeComboReglage[i][3].spin7.value())
  2071. spin8 = str(self.listeComboReglage[i][3].spin8.value())
  2072. spin9 = str(self.listeComboReglage[i][3].spin9.value())
  2073. os.system(("gmic "+"\\\""+self.listeImgSource[0]+"\\\""+" -mirror z -map_sphere "+spin1+','+spin2+','+spin3+" -array_fade "+spin4+','+spin5+" -frame_fuzzy "+spin6+','+spin7+" -resize "+spin8+','+spin9+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  2074. # gmic in.jpg -mirror z -map_sphere 1024,1024,70 -array_fade 3,3 -frame_fuzzy 25,25 -resize 600,450 -o out.jpg
  2075. elif self.listeComboReglage[i][1]=='la_planete_1':
  2076. #################################################
  2077. # Pour Bulles en tableau:
  2078. # -----------------------
  2079. # spin1 --> Position des doubles
  2080. # spin2 --> Rayon de la planète
  2081. # spin3 --> Dilatation
  2082. # spin4 --> Largeur finale de l'image
  2083. # spin5 --> Hauteur finale de l'image
  2084. #################################################
  2085. #spin1 = self.listeComboReglage[i][3].spin1.value()
  2086. spin1 = str(self.listeComboReglage[i][3].spin1.value())
  2087. spin2 = str(self.listeComboReglage[i][3].spin2.value())
  2088. spin3 = self.listeComboReglage[i][3].spin3.value()
  2089. spin3 = str(spin3/100.0)
  2090. spin4 = str(self.listeComboReglage[i][3].spin4.value())
  2091. spin5 = str(self.listeComboReglage[i][3].spin5.value())
  2092. os.system(("gmic "+"\\\""+self.listeImgSource[0]+"\\\""+" -repeat "+spin1+ " --mirror x -a x -done -map_sphere "+spin4+','+spin5+','+spin2+','+spin3+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  2093. # gmic in.jpg -repeat 2 --mirror x -a x -done -map_sphere 400,400,100,0.9 -o out.jpg
  2094. ########Rajout le 28/11/2010 par LUCAS Thomas et CABANA Antoine##################
  2095. elif self.listeComboReglage[i][1]=='vision_thermique':
  2096. #################################################
  2097. # Pour Vision Thermique :
  2098. # -----------------------
  2099. # spin1 --> Minimum de Luminance
  2100. # spin2 --> Maximum de Luminance
  2101. #################################################
  2102. spin1 = str(self.listeComboReglage[i][3].spin1.value())
  2103. spin2 = str(self.listeComboReglage[i][3].spin2.value())
  2104. '''
  2105. if spin1 >= spin2:
  2106. erreur=QMessageBox(self)
  2107. erreur.setText(_(u"Attention, <b>la valeur du mini ne doit jamais être supérieure ou égale à la valeur du maxi de la luminance</b>. L'opération demandée ne sera pas effectuée. Refaites vos réglages correctement et recommencez l'opération."))
  2108. erreur.setWindowTitle(_(u"Erreur de réglage"))
  2109. erreur.setIcon(QMessageBox.Warning)
  2110. erreur.exec_()
  2111. sys.exit
  2112. else:
  2113. #spin1 = str(self.listeComboReglage[i][3].spin1.value()) # Ce réglage est déjà définis plus haut ds le code
  2114. #spin2 = str(self.listeComboReglage[i][3].spin2.value()) # Ce réglage est déjà définis plus haut ds le code
  2115. '''
  2116. os.system(("gmic "+"\\\""+self.listeImgSource[0]+"\\\""+ " -luminance -n "+spin1+','+spin2+" -negative -map 1 -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  2117. #########################################################################
  2118. ########Rajout le 4/02/2011 par LUCAS Thomas et CABANA Antoine##################
  2119. elif self.listeComboReglage[i][1]=='enflamme':
  2120. #################################################
  2121. # Pour Enflamme :
  2122. # -----------------------
  2123. # spin1 --> Palette
  2124. # spin2 --> Amplitude
  2125. # spin3 --> Echantillonnage
  2126. # spin4 --> Lissage
  2127. # spin5 --> Opacité
  2128. # spin6 --> Bord
  2129. # spin7 --> Amplitude du lissage anisotropique
  2130. # spin8 --> Netteté
  2131. # spin9 --> Anisotropie
  2132. # spin10 --> Gradiant de lissage
  2133. # spin11 --> Tenseur de lissage
  2134. # spin12 --> Précision spaciale
  2135. # spin13 --> Précision angulaire
  2136. # spin14 --> Valeur de la précision
  2137. # spin15 --> Iterations
  2138. #################################################
  2139.  
  2140.  
  2141. spin1 = str(self.listeComboReglage[i][3].spin1.value()-1)
  2142. spin2 = str(self.listeComboReglage[i][3].spin2.value())
  2143. spin3 = str(self.listeComboReglage[i][3].spin3.value()/100.0)
  2144. spin4 = str(self.listeComboReglage[i][3].spin4.value()/100.0)
  2145. spin5 = str(self.listeComboReglage[i][3].spin5.value()/100.0)
  2146. spin6 = str(self.listeComboReglage[i][3].spin6.value())
  2147. spin7 = str(self.listeComboReglage[i][3].spin7.value())
  2148. spin8 = str(self.listeComboReglage[i][3].spin8.value()/100.0)
  2149. spin9 = str(self.listeComboReglage[i][3].spin9.value()/100.0)
  2150. spin10 = str(self.listeComboReglage[i][3].spin10.value()/100.0)
  2151. spin11 = str(self.listeComboReglage[i][3].spin11.value()/100.0)
  2152. spin12 = str(self.listeComboReglage[i][3].spin12.value()/100.0)
  2153. spin13 = str(self.listeComboReglage[i][3].spin13.value())
  2154. spin14 = str(self.listeComboReglage[i][3].spin14.value()/100.0)
  2155. spin15 = str(self.listeComboReglage[i][3].spin15.value())
  2156.  
  2157. os.system(("gmic "+" -m fire2.gmic "+"\\\""+self.listeImgSource[0]+"\\\""+
  2158. " -fire "+spin1+','+spin2+','+spin3+','+spin4+','+spin5+','+spin6+','
  2159. +spin7+','+spin8+','+spin9+','+spin10+','+spin11+','+spin12+','+spin13
  2160. +','+spin14+','+spin15+" -o "
  2161. "\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  2162. #################################################################################
  2163.  
  2164. #########################################################################
  2165. ########Rajout le 7/04/2011 par LUCAS Thomas et CABANA Antoine##################
  2166. elif self.listeComboReglage[i][1]=='predator':
  2167. #################################################
  2168. # Pour Predator :
  2169. # -----------------------
  2170. #################################################
  2171.  
  2172. filename=str(self.listeComboReglage[i][3].filename)
  2173.  
  2174.  
  2175. os.system(("gmic "+"\\\""+self.listeImgSource[0]+"\\\" "+filename + " -sub[1] [0] -n[1] 0,255 -sub[1] 50% -cut[1] 0,255 -negative[1] -light_relief[1] 0.3,0.001,0.1,0,0.2,0.5,0.5,1,1 -luminance[1] -add[0] [1] -remove[1] -n 0,255 -o[-1] " "\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  2176. #################################################################################
  2177.  
  2178. #--------------------------------------------------------
  2179. # Filtres utilisant notamment un module python (ex. PIL)
  2180. #--------------------------------------------------------
  2181.  
  2182. elif self.listeComboReglage[i][1]=='vieux_films':
  2183. """Conversion de la 1ère image en Vieux Film"""
  2184. ###################################################################
  2185. # Les commentaires n'ont pas été gardés ici, pour savoir de quoi
  2186. # il en retourne voir dans la fonction appliquerVieuxFilms
  2187. ###################################################################
  2188. listePous=[
  2189. 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_001.png', 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_002.png',
  2190. 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_003.png', 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_004.png',
  2191. 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_005.png', 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_006.png',
  2192. 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_007.png', 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_008.png',
  2193. 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_009.png', 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_010.png',
  2194. 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_011.png', 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_012.png',
  2195. 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_013.png', 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_014.png',
  2196. 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_015.png', 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_016.png',
  2197. 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_017.png', 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_018.png',
  2198. 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_019.png', 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_020.png',
  2199. 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_021.png', 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_022.png',
  2200. 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_023.png', 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_024.png',
  2201. 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_025.png', 'masques'+os.sep+'filtre_vf'+os.sep+'poussiere'+os.sep+'pous_026.png']
  2202.  
  2203. os.system(("convert -blur 1%x1% -fx intensity "+"\""+self.listeImgSource[0]+"\""+' '+"\""+self.repTampon+"vf_vieux_films1"+"\"").encode(locale.getdefaultlocale()[1]))
  2204.  
  2205. img0=Image.open(self.listeImgSource[0])
  2206. taille=img0.size
  2207. # Pas besoin d'utiliser encode ici.
  2208. os.system("convert "+"\""+listePous[0]+"\""+" -resize "+ str(taille[0])+'x'+str(taille[1])+"! "+"\""+self.repTampon+"vf_vieux_films2"+"\"")
  2209. img1 = Image.open(self.repTampon+"vf_vieux_films2")
  2210. img2 = Image.open(self.repTampon+"vf_vieux_films1")
  2211. compos = Image.composite(img1,img2,img1)
  2212. compos.save(self.cheminCourantSauv)
  2213.  
  2214. elif self.listeComboReglage[i][1]=='illustration_niveau_gris':
  2215. """Conversion de la 1ère image en niveaux de gris"""
  2216. obImg = Image.open(self.listeImgSource[0])
  2217. convert = obImg.convert("1")
  2218. convert.save(self.cheminCourantSauv)
  2219.  
  2220. elif self.listeComboReglage[i][1]=='traits_fins&couleur':
  2221. """Conversion de la 1ère image en traits fins et couleur"""
  2222. obImg = Image.open(self.listeImgSource[0])
  2223. convert = obImg.filter(ImageFilter.EDGE_ENHANCE_MORE)
  2224. convert.save(self.cheminCourantSauv)
  2225.  
  2226. elif self.listeComboReglage[i][1]=='emboss':
  2227. """Conversion de la 1ère image en emboss"""
  2228. obImg = Image.open(self.listeImgSource[0])
  2229. convert = obImg.filter(ImageFilter.EMBOSS)
  2230. convert.save(self.cheminCourantSauv)
  2231.  
  2232. elif self.listeComboReglage[i][1]=='sharpen':
  2233. """Conversion de la 1ère image en sharpen"""
  2234. obImg = Image.open(self.listeImgSource[0])
  2235. convert = obImg.filter(ImageFilter.SHARPEN)
  2236. convert.save(self.cheminCourantSauv)
  2237.  
  2238. elif self.listeComboReglage[i][1]=='niveau_gris':
  2239. """Conversion de la 1ère image en niveau de gris"""
  2240. obImg = Image.open(self.listeImgSource[0])
  2241. convert = obImg.convert("L")
  2242. convert.save(self.cheminCourantSauv)
  2243.  
  2244. elif self.listeComboReglage[i][1]=='amelior_des_bords':
  2245. """Conversion de la 1ère image en ameliorant les bords"""
  2246. obImg = Image.open(self.listeImgSource[0])
  2247. convert = obImg.filter(ImageFilter.Kernel((3, 3), (-1, -2, -1, -2, 16, -2, -1, -2, -1)))
  2248. convert.save(self.cheminCourantSauv)
  2249.  
  2250. elif self.listeComboReglage[i][1]=='debruitage':
  2251. """Conversion de la 1ère image en debruitant"""
  2252. obImg = Image.open(self.listeImgSource[0])
  2253. convert = obImg.filter(ImageFilter.Kernel((5, 5), (2, 4, 5, 4, 2, 4, 9, 12, 9, 4, 5, 12, 15, 12, 5, 4, 9, 12, 9, 4, 2, 4, 5, 4, 2)))
  2254. convert.save(self.cheminCourantSauv)
  2255.  
  2256. elif self.listeComboReglage[i][1]=='evanescence':
  2257. """Conversion de la 1ère image en Dessin 9: traits noirs, fond blanc"""
  2258. ###################################################################
  2259. # Les commentaires n'ont pas été gardés ici, pour savoir de quoi
  2260. # il en retourne voir dans la fonction appliquerEvanescence
  2261. ###################################################################
  2262. indexCombo = self.listeComboReglage[i][3].combo.currentIndex()
  2263. entreeCombo = str(self.listeComboReglage[i][3].combo.itemData(indexCombo).toStringList()[0])
  2264. obImg = Image.open(self.listeImgSource[0]).convert("L")
  2265. w, h = obImg.size
  2266. imKernel = obImg.filter(ImageFilter.Kernel((5, 5), (-2, -2, -2, -2, -2, -1, -1, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, -1, -1, -2, -2, -2, -2, -2)))
  2267. imKernel.save(self.repTampon+'_tmp_g546gf546ezr53ww7i.png', 'PNG')
  2268. ouvImg = Image.open(self.repTampon+'_tmp_g546gf546ezr53ww7i.png')
  2269. egalise = ImageOps.equalize(ouvImg)
  2270. nouvImg = Image.new("L", (w, h))
  2271. nouvImg.putdata(egalise.getdata())
  2272. data = array(nouvImg)
  2273. aplat = data.flat
  2274. condition=(aplat>=1)&(aplat<=255)
  2275. if entreeCombo=='fond_blanc_lignes_noires': idCond = where(condition, 255, 0)
  2276. elif entreeCombo=='fond_noir_lignes_blanches': idCond = where(condition, 0, 255)
  2277. nouvImgBinaire=Image.new("L", (w, h))
  2278. nouvImgBinaire.putdata(idCond.tolist())
  2279. nouvImgBinaire.save(self.cheminCourantSauv)
  2280. os.remove(self.repTampon+'_tmp_g546gf546ezr53ww7i.png')
  2281.  
  2282. elif self.listeComboReglage[i][1]=='seuillage':
  2283. """Conversion de la 1ère image en Dessin 8: seuillage"""
  2284. ###################################################################
  2285. # Les commentaires n'ont pas été gardés ici, pour savoir de quoi
  2286. # il en retourne voir dans la fonction appliquerSeuillage
  2287. ###################################################################
  2288. obImg = Image.open(self.listeImgSource[0])
  2289. spin1 = self.listeComboReglage[i][3].spin1.value() # seuil bas
  2290. spin2 = self.listeComboReglage[i][3].spin2.value() # seuil haut
  2291. if spin1>=spin2:
  2292. erreur=QMessageBox(self)
  2293. erreur.setText(_(u"Attention, <b>la valeur de seuillage bas doit obligatoirement être inférieure à la valeur de seuillage haut</b>. La conversion demandée ne sera pas effectuée. Refaites vos réglages correctement et recommencez l'opération."))
  2294. erreur.setWindowTitle(_(u"Erreur de réglage"))
  2295. erreur.setIcon(QMessageBox.Warning)
  2296. erreur.exec_()
  2297. sys.exit
  2298. else: pass
  2299. imageNDG = obImg.convert("L")
  2300. wSeuil, hSeuil = imageNDG.size
  2301. egaliseNDG_Seuil = ImageOps.equalize(imageNDG)
  2302. nouvImgNDG_Seuil = Image.new("L", (wSeuil, hSeuil))
  2303. nouvImgNDG_Seuil.putdata(egaliseNDG_Seuil.getdata())
  2304. dataNDG_Seuil=array(nouvImgNDG_Seuil)
  2305. aplatNDG_Seuil=dataNDG_Seuil.flat
  2306. condSeuil=(aplatNDG_Seuil>=spin1)&(aplatNDG_Seuil<=spin2)
  2307. idSeuil=where(condSeuil, 0, 255)
  2308. nouvImgBinaire=Image.new("L", (wSeuil, hSeuil))
  2309. nouvImgBinaire.putdata(idSeuil.tolist())
  2310. nouvImgBinaire.save(self.cheminCourantSauv)
  2311.  
  2312. elif self.listeComboReglage[i][1]=='imitation_bd_1':
  2313. """Conversion de la 1ère image en Dessin 10: imitation bande dessinée"""
  2314. ###################################################################
  2315. # Les commentaires n'ont pas été gardés ici, pour savoir de quoi
  2316. # il en retourne voir dans la fonction appliquerImitationBd
  2317. ###################################################################
  2318. spin1 = self.listeComboReglage[i][3].spin1.value() # intensité des traits
  2319. spin2 = self.listeComboReglage[i][3].spin2.value() # réduction des couleurs
  2320. spin3 = self.listeComboReglage[i][3].spin3.value() # contraste de couleurs
  2321. obImg = Image.open(self.listeImgSource[0]).convert("L")
  2322. w, h = obImg.size
  2323. imKernel = obImg.filter(ImageFilter.Kernel((5, 5), (-2, -2, -2, -2, -2, -1, -1, 0, 0, 0, 0, 0, spin1, 0, 0, 0, 0, 0, -1, -1, -2, -2, -2, -2, -2)))
  2324. imKernel.save(self.repTampon+'tmp_gds568ec4u5hg53g7s9m4rt.png', 'PNG')
  2325. ouvImg = Image.open(self.repTampon+'tmp_gds568ec4u5hg53g7s9m4rt.png')
  2326. egalise = ImageOps.equalize(ouvImg)
  2327. nouvImg = Image.new("L", (w, h))
  2328. nouvImg.putdata(egalise.getdata())
  2329. data = array(nouvImg)
  2330. aplat = data.flat
  2331. condition = (aplat>=1)&(aplat<=255)
  2332. idCond = where(condition, 255, 0)
  2333. nouvImgBinaire = Image.new("L", (w, h))
  2334. nouvImgBinaire.putdata(idCond.tolist())
  2335. listeAlpha_1=list(nouvImgBinaire.getdata())
  2336. newListRGBAbin=[]
  2337. for parcListe in listeAlpha_1:
  2338. if parcListe==255: newListRGBAbin.append((255, 255, 255, 0))
  2339. else: newListRGBAbin.append((0, 0, 0, 255))
  2340. nouvImgRGBA=Image.new("RGBA", (w, h))
  2341. nouvImgRGBA.putdata(newListRGBAbin)
  2342. nouvImgRGBA.save(self.repTampon+'tmp_gds568ec4u5hg53g7s9m4rt.png', 'PNG')
  2343. spin3=float(spin3/10.0)
  2344. imPrinc=Image.open(self.listeImgSource[0])
  2345. imPosterize=ImageOps.posterize(imPrinc, spin2)
  2346. imPosterize.convert('RGBA')
  2347. imPosterize.save(self.repTampon+'tmp_gds89gfdt39xfg6d9qxx1f.png', 'PNG')
  2348. imPostTraitC=Image.open(self.repTampon+'tmp_gds89gfdt39xfg6d9qxx1f.png')
  2349. imContraste=ImageEnhance.Contrast(imPostTraitC)
  2350. imContraste.enhance(spin3).save(self.repTampon+'tmp_gds486fsf68q2wx5k7u1oop.png', 'PNG')
  2351. imOpc=Image.open(self.repTampon+'tmp_gds486fsf68q2wx5k7u1oop.png')
  2352. imOpc.convert('RGBA')
  2353. imFondTransp=Image.open(self.repTampon+'tmp_gds568ec4u5hg53g7s9m4rt.png')
  2354. compoContCoul=Image.composite(imFondTransp, imOpc, imFondTransp)
  2355. compoContCoul.save(self.cheminCourantSauv)
  2356. os.remove(self.repTampon+'tmp_gds568ec4u5hg53g7s9m4rt.png')
  2357. os.remove(self.repTampon+'tmp_gds89gfdt39xfg6d9qxx1f.png')
  2358. os.remove(self.repTampon+'tmp_gds486fsf68q2wx5k7u1oop.png')
  2359.  
  2360. elif self.listeComboReglage[i][1]=='negatif':
  2361. """Conversion de la 1ère image en Negatif: inverse les couleurs"""
  2362. ###################################################################
  2363. # Les commentaires n'ont pas été gardés ici, pour savoir de quoi
  2364. # il en retourne voir dans la fonction appliquerNegatif
  2365. ###################################################################
  2366. indexCombo = self.listeComboReglage[i][3].combo.currentIndex()
  2367. entreeCombo = str(self.listeComboReglage[i][3].combo.itemData(indexCombo).toStringList()[0])
  2368. obImg = Image.open(self.listeImgSource[0])
  2369. if entreeCombo=='negatif_couleur':
  2370. negatif = ImageOps.invert(obImg)
  2371. elif entreeCombo=='negatif_n_et_b':
  2372. obImg = obImg.convert("L")
  2373. negatif = ImageOps.invert(obImg)
  2374. negatif.save(self.cheminCourantSauv)
  2375.  
  2376. elif self.listeComboReglage[i][1]=='encadre_photo':
  2377. """Conversion de la 1ère image en Encadrement photographique"""
  2378. ###################################################################
  2379. # Les commentaires n'ont pas été gardés ici, pour savoir de quoi
  2380. # il en retourne voir dans la fonction appliquerEncadrePhoto
  2381. ###################################################################
  2382. indexCombo = self.listeComboReglage[i][3].combo.currentIndex()
  2383. entreeCombo = str(self.listeComboReglage[i][3].combo.itemData(indexCombo).toStringList()[0])
  2384. obImg = Image.open(self.listeImgSource[0])
  2385. if entreeCombo=='noir': couleur = (0, 0, 0)
  2386. elif entreeCombo=='gris': couleur = (128, 128, 128)
  2387. elif entreeCombo=='blanc': couleur = (255, 255, 255)
  2388. elif entreeCombo=='rouge': couleur = (255, 0, 0)
  2389. elif entreeCombo=='vert': couleur = (0, 255, 0)
  2390. elif entreeCombo=='bleu': couleur = (0, 0, 255)
  2391. elif entreeCombo=='jaune': couleur = (255, 255, 0)
  2392. cadre = ImageOps.expand(obImg, 40, couleur)
  2393. cadre.save(self.cheminCourantSauv)
  2394.  
  2395. elif self.listeComboReglage[i][1]=='couleurs_predefinies':
  2396. """Conversion de la 1ère image en Couleurs Prédéfinies"""
  2397. ###################################################################
  2398. # Les commentaires n'ont pas été gardés ici, pour savoir de quoi
  2399. # il en retourne voir dans la fonction appliquerCouleursPredef
  2400. ###################################################################
  2401. indexCombo = self.listeComboReglage[i][3].combo.currentIndex()
  2402. entreeCombo = str(self.listeComboReglage[i][3].combo.itemData(indexCombo).toStringList()[0])
  2403. if entreeCombo=="rouge_vif":
  2404. couleur_Img_Predef=(
  2405. 1.0, 0.3, 0.0, 0,
  2406. 0.0, 0.0, 0.0, 0,
  2407. 0.0, 0.0, 0.0, 0)
  2408. elif entreeCombo=="rouge_primaire":
  2409. couleur_Img_Predef=(
  2410. 1.0, 0.3, 0.0, 0,
  2411. 0.0, 0.0, 0.0, 0,
  2412. 0.7, 0.0, 0.0, 0)
  2413. elif entreeCombo=="vert_perroquet":
  2414. couleur_Img_Predef=(
  2415. 0.0, 0.0, 0.0, 0,
  2416. 1.0, 0.3, 0.0, 0,
  2417. 0.0, 0.0, 0.0, 0)
  2418. elif entreeCombo=="vert_acide_clair":
  2419. couleur_Img_Predef=(
  2420. 1.0, 0.0, 0.0, 0,
  2421. 1.0, 0.3, 0.0, 0,
  2422. 0.0, 0.0, 0.0, 0)
  2423. elif entreeCombo=="bleu_roi":
  2424. couleur_Img_Predef=(
  2425. 0.0, 0.0, 0.0, 0,
  2426. 1.0, 0.0, 0.0, 0,
  2427. 1.0, 1.0, 0.0, 0)
  2428. elif entreeCombo=="bleu_indigo":
  2429. couleur_Img_Predef=(
  2430. 1.0, 0.0, 0.0, 0,
  2431. 1.0, 0.0, 0.0, 0,
  2432. 1.0, 1.0, 0.0, 0)
  2433. elif entreeCombo=="bleu_turquoise":
  2434. couleur_Img_Predef=(
  2435. 1.0, 0.0, 0.0, 0,
  2436. 1.0, 1.0, 0.0, 0,
  2437. 1.0, 1.0, 0.0, 0)
  2438. elif entreeCombo=="jaune_or":
  2439. couleur_Img_Predef=(
  2440. 0.64, 0.64, 0.10, 0,
  2441. 0.56, 0.56, 0.10, 0,
  2442. 0.0, 0.0, 0.0, 0)
  2443. elif entreeCombo=="jaune_orange":
  2444. couleur_Img_Predef=(
  2445. 1.0, 0.5, 0.5, 0,
  2446. 1.0, 0.3, 0.0, 0,
  2447. 0.0, 0.0, 0.0, 0)
  2448. elif entreeCombo=="saumon":
  2449. couleur_Img_Predef=(
  2450. 1.0, 0.5, 0.0, 0,
  2451. 1.0, 0.1, 0.0, 0,
  2452. 1.0, 0.0, 0.0, 0)
  2453. elif entreeCombo=="marron_tres_clair":
  2454. couleur_Img_Predef=(
  2455. 0.95, 0.38, 0.0, 0,
  2456. 0.90, 0.15, 0.0, 0,
  2457. 0.48, 0.26, 0.0, 0)
  2458. elif entreeCombo=="terre argileuse":
  2459. couleur_Img_Predef=(
  2460. 0.96, 0.58, 0.0, 0,
  2461. 0.56, 0.44, 0.0, 0,
  2462. 0.46, 0.32, 0.0, 0)
  2463. elif entreeCombo=="gris_colore_rouge":
  2464. couleur_Img_Predef=(
  2465. 0.68, 0.68, 0.0, 0,
  2466. 0.50, 0.50, 0.0, 0,
  2467. 0.50, 0.50, 0.0, 0)
  2468. elif entreeCombo=="gris_colore_vert":
  2469. couleur_Img_Predef=(
  2470. 0.50, 0.50, 0.0, 0,
  2471. 0.62, 0.62, 0.0, 0,
  2472. 0.50, 0.50, 0.0, 0)
  2473. elif entreeCombo=="gris_colore_bleu":
  2474. couleur_Img_Predef=(
  2475. 0.50, 0.50, 0.0, 0,
  2476. 0.50, 0.50, 0.0, 0,
  2477. 0.64, 0.64, 0.0, 0)
  2478. elif entreeCombo=="gris_colore_jaune":
  2479. couleur_Img_Predef=(
  2480. 0.62, 0.62, 0.0, 0,
  2481. 0.62, 0.62, 0.0, 0,
  2482. 0.50, 0.50, 0.0, 0)
  2483. obImg = Image.open(self.listeImgSource[0])
  2484. convert = obImg.convert("RGB").convert("RGB", couleur_Img_Predef)
  2485. convert.save(self.cheminCourantSauv)
  2486.  
  2487. elif self.listeComboReglage[i][1]=='couleurs_personnalisees':
  2488. """Conversion de la 1ère image en Couleurs Personnalisees"""
  2489. listeCouleurImgPerso=[]
  2490. for k in range(3):
  2491. for l in range(3):
  2492. listeCouleurImgPerso.append(float('0.'+str(self.listeComboReglage[i][3].spin[k][l].value())))
  2493. listeCouleurImgPerso.append(0)
  2494. print listeCouleurImgPerso
  2495. obImg=Image.open(self.listeImgSource[0])
  2496. convert = obImg.convert("RGB").convert("RGB", listeCouleurImgPerso)
  2497. convert.save(self.cheminCourantSauv)
  2498.  
  2499. elif self.listeComboReglage[i][1]=='separ_en_modules':
  2500. """Conversion de la 1ère image en Séparation et modules"""
  2501. spin1 = self.listeComboReglage[i][3].spin1.value()
  2502. spin2 = self.listeComboReglage[i][3].spin2.value()
  2503. if spin1>=spin2:
  2504. erreur=QMessageBox(self)
  2505. erreur.setText(_(u"Attention, <b>la valeur de taille mini de la forme ne doit jamais être supérieure ou égale à la valeur de la taille maxi de la forme</b>. La conversion demandée ne sera pas effectuée. Refaites vos réglages correctement et recommencez l'opération."))
  2506. erreur.setWindowTitle(_(u"Erreur de réglage"))
  2507. erreur.setIcon(QMessageBox.Warning)
  2508. erreur.exec_()
  2509. sys.exit
  2510. else:
  2511. try:
  2512. obImg=Image.open(self.listeImgSource[0])
  2513. width, height=obImg.size
  2514. drawImage = ImageDraw.Draw(obImg)
  2515. pixels = list(obImg.getdata())
  2516. # Travail avec les pixels
  2517. for y in range(0, height, spin1):
  2518. yp = y * width
  2519. for x in range(0, width, spin1):
  2520. xyp = yp + x
  2521. p = pixels[xyp]
  2522. rndSize = random.randint(spin1, spin2)
  2523. x1 = x - rndSize
  2524. y1 = y - rndSize
  2525. x2 = x + rndSize
  2526. y2 = y + rndSize
  2527. drawImage.rectangle((x1, y1, x2, y2), fill=p, outline=(0,0,0))
  2528. obImg.save(self.cheminCourantSauv)
  2529.  
  2530. except:
  2531. erreur=QMessageBox(self)
  2532. erreur.setText(_(u"<p>EKD ne peut pas travailler avec les images dont le mode est <b>L</b> (il s'agit d'images en niveaux de gris), <b>P</b> (images GIF). Vérifiez le mode de l'image que vous avez sélectionné (et ce dans l'onglet <b>Image(s) source</b>), pour ce faire cliquez sur le bouton <b>Infos</b> (dans la fenêtre qui s'ouvre, l'image fautive devrait avoir soit <b>L</b> ou soit <b>P</b> indiqué en face du champ <b>Mode</b>). Eliminez cette image (par le bouton <b>Retirer</b>) et relancez la visualisation en sélectionnant une autre image (et ensuite en cliquant sur <b>Voir le résultat</b>).</p>"))
  2533. erreur.setWindowTitle(_(u"Erreur"))
  2534. erreur.setIcon(QMessageBox.Critical)
  2535. erreur.exec_()
  2536. return 0
  2537.  
  2538. elif self.listeComboReglage[i][1]=='omb_lum_a_la_coul':
  2539. """Conversion de la 1ère image en Ombre et lumière à la couleur"""
  2540. ll=[]
  2541. for k in range(4):
  2542. for l in range(2):
  2543. ll.append(self.listeComboReglage[i][3].spin[k][l].value())
  2544. self.lValCoul=[ll[0], ll[2], ll[4], ll[6], ll[1], ll[3], ll[5], ll[7]]
  2545. obImg=Image.open(self.listeImgSource[0])
  2546. imageNDG = obImg.convert("L")
  2547. wSeuil, hSeuil = imageNDG.size
  2548. egaliseNDG_Seuil = ImageOps.equalize(imageNDG)
  2549. nouvImgNDG_Seuil = Image.new("L", (wSeuil, hSeuil))
  2550. nouvImgNDG_Seuil.putdata(egaliseNDG_Seuil.getdata())
  2551. dataNDG_Seuil=array(nouvImgNDG_Seuil)
  2552. aplatNDG_Seuil=dataNDG_Seuil.flat
  2553. condSeuil=(aplatNDG_Seuil>=128)&(aplatNDG_Seuil<=255)
  2554. idSeuil=where(condSeuil, 0, 255)
  2555. transListe=idSeuil.tolist()
  2556. quatreCanaux=[[parcTrans]*4 for parcTrans in transListe]
  2557. transTuple=[tuple(parcTuple) for parcTuple in quatreCanaux]
  2558. listeDonnees=[]
  2559. for parcDonnees in transTuple:
  2560. if parcDonnees==(255, 255, 255, 255):
  2561. parcDonnees=(self.lValCoul[0], self.lValCoul[1], self.lValCoul[2], self.lValCoul[3])
  2562. listeDonnees.append(parcDonnees)
  2563. elif parcDonnees==(0, 0, 0, 0):
  2564. parcDonnees=(self.lValCoul[4], self.lValCoul[5], self.lValCoul[6], self.lValCoul[7])
  2565. listeDonnees.append(parcDonnees)
  2566. nouvImg=Image.new("RGBA", (wSeuil, hSeuil))
  2567. nouvImg.putdata(listeDonnees)
  2568. nouvImg.save(self.cheminCourantSauv)
  2569.  
  2570. elif self.listeComboReglage[i][1]=='rotation_image':
  2571. # Récupération de l'index et l'entrée du combo de sélection
  2572. indexCombo = self.listeComboReglage[i][3].combo.currentIndex()
  2573. entreeCombo = str(self.listeComboReglage[i][3].combo.itemData(indexCombo).toStringList()[0])
  2574. # Ouverture de l'image
  2575. obImg = Image.open(self.listeImgSource[0])
  2576. #
  2577. if entreeCombo=='rot_img_90_gauche': rot = 90
  2578. elif entreeCombo=='rot_img_180_gauche': rot = 180
  2579. elif entreeCombo=='rot_img_270_gauche': rot = 270
  2580. # Application du filtre
  2581. obImg.rotate(rot).save(self.cheminCourantSauv)
  2582.  
  2583. elif self.listeComboReglage[i][1]=='imitation_bd_2':
  2584. ###################################################################
  2585. # Les commentaires n'ont pas été gardés ici, pour savoir de quoi
  2586. # il en retourne voir dans la fonction appliquerImitationBd
  2587. ###################################################################
  2588. spin1 = self.listeComboReglage[i][3].spin.value() # intensité des traits
  2589. spin2 = str(self.listeComboReglage[i][3].spin2.value()) # flou des couleurs
  2590.  
  2591. os.system(("convert -noise "+spin2+" -gamma 1.4 "+"\""+self.listeImgSource[0]+"\""+' '+"\""+self.repTampon+'tmp_colf84dv556tdf65gu.png'+"\"").encode(locale.getdefaultlocale()[1]))
  2592.  
  2593. obImg = Image.open(self.listeImgSource[0]).convert("L")
  2594. w, h = obImg.size
  2595. imKernel = obImg.filter(ImageFilter.Kernel((5, 5), (-2, -2, -2, -2, -2, -1, -1, 0, 0, 0, 0, 0, spin1, 0, 0, 0, 0, 0, -1, -1, -2, -2, -2, -2, -2)))
  2596. imKernel.save(self.repTampon+'tmp_tfgt6gr99yc9terff4.png', 'PNG')
  2597. ouvImg = Image.open(self.repTampon+'tmp_tfgt6gr99yc9terff4.png')
  2598. egalise = ImageOps.equalize(ouvImg)
  2599. nouvImg = Image.new("L", (w, h))
  2600. nouvImg.putdata(egalise.getdata())
  2601. data = array(nouvImg)
  2602. aplat = data.flat
  2603. condition = (aplat>=1)&(aplat<=255)
  2604. idCond = where(condition, 255, 0)
  2605. nouvImgBinaire = Image.new("L", (w, h))
  2606. nouvImgBinaire.putdata(idCond.tolist())
  2607. listeAlpha_1=list(nouvImgBinaire.getdata())
  2608. newListRGBAbin=[]
  2609. for parcListe in listeAlpha_1:
  2610. if parcListe==255: newListRGBAbin.append((255, 255, 255, 0))
  2611. else: newListRGBAbin.append((0, 0, 0, 255))
  2612. nouvImgRGBA=Image.new("RGBA", (w, h))
  2613. nouvImgRGBA.putdata(newListRGBAbin)
  2614. nouvImgRGBA.save(self.repTampon+'tmp_tfgt6gr99yc9terff4.png', 'PNG')
  2615.  
  2616. imOpc=Image.open(self.repTampon+'tmp_colf84dv556tdf65gu.png')
  2617. imOpc.convert('RGBA')
  2618. imFondTransp=Image.open(self.repTampon+'tmp_tfgt6gr99yc9terff4.png')
  2619. compoContCoul=Image.composite(imFondTransp, imOpc, imFondTransp)
  2620. compoContCoul.save(self.cheminCourantSauv)
  2621. os.remove(self.repTampon+'tmp_colf84dv556tdf65gu.png')
  2622. os.remove(self.repTampon+'tmp_tfgt6gr99yc9terff4.png')
  2623.  
  2624. elif self.listeComboReglage[i][1]=='laplacien_1':
  2625. # Récupération de l'index et l'entrée du combo de sélection
  2626. indexCombo = self.listeComboReglage[i][3].combo.currentIndex()
  2627. entreeCombo = str(self.listeComboReglage[i][3].combo.itemData(indexCombo).toStringList()[0])
  2628. # Ouverture de l'image avec conditions
  2629. if entreeCombo=="laplacien_1_noir_et_blanc":
  2630. obImg = Image.open(self.listeImgSource[0]).convert('L')
  2631. elif entreeCombo=="laplacien_1_couleur":
  2632. obImg = Image.open(self.listeImgSource[0]).convert('RGB')
  2633. sizeKern5x5=(5, 5)
  2634. kernLaplacien_1 = (-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 24, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
  2635. imKernelLaplacien_1 = obImg.filter(ImageFilter.Kernel(sizeKern5x5, kernLaplacien_1)).save(self.cheminCourantSauv)
  2636.  
  2637. elif self.listeComboReglage[i][1]=='contour_et_couleur':
  2638. ###################################################################
  2639. # Les commentaires n'ont pas été gardés ici, pour savoir de quoi
  2640. # il en retourne voir dans la fonction appliquerContourEtCouleur
  2641. ###################################################################
  2642. # Partie trait/contour
  2643. ###################################################################
  2644. coul_rouge_trait = self.listeComboReglage[i][3].spin[0][2].value() # rouge
  2645. coul_vert_trait = self.listeComboReglage[i][3].spin[1][2].value() # vert
  2646. coul_bleu_trait = self.listeComboReglage[i][3].spin[2][2].value() # bleu
  2647. transparence_trait = self.listeComboReglage[i][3].spin[3][2].value() # transparence
  2648. # Valeur de l'intensité du trait
  2649. val_intens_trait = self.listeComboReglage[i][3].spin[len(self.listeComboReglage[i][3].spin)-1].value()
  2650.  
  2651. obImg = Image.open(self.listeImgSource[0]).convert("L")
  2652. w, h = obImg.size
  2653. imKernel = obImg.filter(ImageFilter.Kernel((5, 5), (-2, -2, -2, -2, -2, -1, -1, 0, 0, 0, 0, 0, val_intens_trait, 0, 0, 0, 0, 0, -1, -1, -2, -2, -2, -2, -2)))
  2654. imKernel.save(self.repTampon+'tmp_gdf5t4n158w61816qf78f5fd599q.png', 'PNG')
  2655. ouvImg = Image.open(self.repTampon+'tmp_gdf5t4n158w61816qf78f5fd599q.png')
  2656. egalise = ImageOps.equalize(ouvImg)
  2657. nouvImg = Image.new("L", (w, h))
  2658. nouvImg.putdata(egalise.getdata())
  2659. data = array(nouvImg)
  2660. aplat = data.flat
  2661. condition = (aplat>=1)&(aplat<=255)
  2662. idCond = where(condition, 255, 0)
  2663. nouvImgBinaire = Image.new("L", (w, h))
  2664. nouvImgBinaire.putdata(idCond.tolist())
  2665. listeAlpha_1=list(nouvImgBinaire.getdata())
  2666. newListRGBAbin=[]
  2667. for parcListe in listeAlpha_1:
  2668. if parcListe==255: newListRGBAbin.append((255, 255, 255, 0))
  2669. else: newListRGBAbin.append((coul_rouge_trait, coul_vert_trait, coul_bleu_trait, transparence_trait))
  2670. nouvImgRGBA=Image.new("RGBA", (w, h))
  2671. nouvImgRGBA.putdata(newListRGBAbin)
  2672. nouvImgRGBA.save(self.repTampon+'tmp_gdf5t4n158w61816qf78f5fd599q.png', 'PNG')
  2673. ###################################################################
  2674. # Partie couleur (ombre et lumière)
  2675. ###################################################################
  2676. ll=[]
  2677. for k in range(4):
  2678. for l in range(2):
  2679. ll.append(self.listeComboReglage[i][3].spin[k][l].value())
  2680. self.lValCoul=[ll[0], ll[2], ll[4], ll[6], ll[1], ll[3], ll[5], ll[7]]
  2681. obImg=Image.open(self.listeImgSource[0])
  2682. imageNDG = obImg.convert("L")
  2683. wSeuil, hSeuil = imageNDG.size
  2684. egaliseNDG_Seuil = ImageOps.equalize(imageNDG)
  2685. nouvImgNDG_Seuil = Image.new("L", (wSeuil, hSeuil))
  2686. nouvImgNDG_Seuil.putdata(egaliseNDG_Seuil.getdata())
  2687. dataNDG_Seuil=array(nouvImgNDG_Seuil)
  2688. aplatNDG_Seuil=dataNDG_Seuil.flat
  2689. condSeuil=(aplatNDG_Seuil>=128)&(aplatNDG_Seuil<=255)
  2690. idSeuil=where(condSeuil, 0, 255)
  2691. transListe=idSeuil.tolist()
  2692. quatreCanaux=[[parcTrans]*4 for parcTrans in transListe]
  2693. transTuple=[tuple(parcTuple) for parcTuple in quatreCanaux]
  2694. listeDonnees=[]
  2695. for parcDonnees in transTuple:
  2696. if parcDonnees==(255, 255, 255, 255):
  2697. parcDonnees=(self.lValCoul[0], self.lValCoul[1], self.lValCoul[2], self.lValCoul[3])
  2698. listeDonnees.append(parcDonnees)
  2699. elif parcDonnees==(0, 0, 0, 0):
  2700. parcDonnees=(self.lValCoul[4], self.lValCoul[5], self.lValCoul[6], self.lValCoul[7])
  2701. listeDonnees.append(parcDonnees)
  2702. nouvImg=Image.new("RGBA", (wSeuil, hSeuil))
  2703. nouvImg.putdata(listeDonnees)
  2704. #nouvImg.save(self.cheminCourantSauv)
  2705. nouvImg.save(self.repTampon+'tmp_gdfg586re65fg86r68efez8erz535.png', 'PNG')
  2706. ##################################################
  2707. # Compositing
  2708. ##################################################
  2709. imFondTransp=Image.open(self.repTampon+'tmp_gdf5t4n158w61816qf78f5fd599q.png')
  2710. compoContCoul=Image.composite(imFondTransp, nouvImg, imFondTransp)
  2711. compoContCoul.save(self.cheminCourantSauv)
  2712. os.remove(self.repTampon+'tmp_gdf5t4n158w61816qf78f5fd599q.png')
  2713. os.remove(self.repTampon+'tmp_gdfg586re65fg86r68efez8erz535.png')
  2714. ##################################################
  2715.  
  2716. # Affichage de l'image temporaire dans l'onglet
  2717. # Images après traitement
  2718. #
  2719. # Ouverture d'une boite de dialogue affichant l'aperçu.
  2720.  
  2721. # Affichage par le bouton Voir le résultat
  2722. visio = VisionneurEvolue(self.cheminCourantSauv)
  2723. visio.redimenFenetre(self.mainWindowFrameGeometry, 1., 0.7)
  2724. visio.exec_()
  2725.  
  2726. return 0
  2727.  
  2728.  
  2729. def appliquer0(self):
  2730. """Préparation de la conversion"""
  2731.  
  2732. self.listeImgSource=self.afficheurImgSource.getFiles()
  2733.  
  2734. # Onglet de log
  2735. self.zoneAffichInfosImg.setText(self.infosImgTitre[0]+"\n".join(self.listeImgSource))
  2736.  
  2737. # Redimensionner les images de tailles différentes
  2738. self.redim_img()
  2739.  
  2740. # Récupération du chemin
  2741. rep = self.base.getRepSource(self.config)
  2742.  
  2743. # Utilisation de la nouvelle boîte de dialogue de sauvegarde
  2744. suffix=""
  2745. self.cheminSauv = EkdSaveDialog(self, os.path.expanduser(rep), suffix, _(u"Sauver"), multiple=True)
  2746. self.cheminSauv = self.cheminSauv.getFile()
  2747.  
  2748. if not self.cheminSauv: return
  2749.  
  2750. #print 'Chemin+nom de sauvegarde:', self.cheminSauv
  2751.  
  2752. # Condition à respecter pour qu'une redimension ait lieu
  2753. self.conversionImg = 0
  2754.  
  2755. # Liste des fichiers de destination
  2756. self.listeImgDestin = []
  2757.  
  2758. # Extension/format des images
  2759. self.ext = os.path.splitext(self.listeImgSource[0])[1].encode("UTF8")
  2760.  
  2761. # Liste des indices des images [0,1,2,...,nombre d'images-1]
  2762. self.listeIndex = range(len(self.listeImgSource))
  2763.  
  2764. # Nombre d'images sources
  2765. self.nbrImg = len(self.listeImgSource)
  2766.  
  2767. # Récupération de l'identifiant du codec
  2768. self.i = self.comboReglage.currentIndex()
  2769.  
  2770. # Indice de l'image à convertir
  2771. self.j = 0
  2772.  
  2773. # Drapeau (réinitialisation): terminer le filtre avec commande 100% shell
  2774. self.terminerFiltreShell = 0
  2775.  
  2776. self.progress.reset() # wasCanceled est remis à 0 -> la conversion ne s'arrête pas à la 1ère img
  2777. self.progress.show()
  2778. self.progress.setValue(0)
  2779. QApplication.processEvents()
  2780.  
  2781. # Faire en sorte que la boite de dialogue ait le temps de s'afficher correctement
  2782. QTimer.singleShot(0, self.appliquer)
  2783.  
  2784.  
  2785. def appliquer(self):
  2786. """Conversion des images"""
  2787.  
  2788. # L'incrémentation de l'indice de l'image source se fait dans cette fonction si le
  2789. # filtre est choisi
  2790. # contient un moteur module python, ou dans opReccurApresApp() pour 1 filtre 100%
  2791. # commande shell
  2792.  
  2793. # Sauvegarde
  2794. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  2795.  
  2796. #------------------------------
  2797. # Filtres 100% commande shell
  2798. #------------------------------
  2799.  
  2800. # Mise en place de conditions pour linux et windows
  2801. # Attention dans la version windows ce n'est pas traité par un QProcess (comme sous
  2802. # Linux) mais directement avec os.system (car le QProcess avec la commande convert
  2803. # d'ImageMagick génère une erreur)
  2804.  
  2805. # Sous windows process.start(...) est désactivé car cela ne fonctionne pas avec les
  2806. # commandes ImageMagick, os.system(...) est utilisé à la place. Changement du code pour
  2807. # s'accorder avec os.system(...)
  2808.  
  2809. # Le code est plus long que dans la version Linux --> la boucle a été rajoutée ds
  2810. # chaque choix pour les filtres dépendant d'ImageMagick.
  2811.  
  2812. if self.listeComboReglage[self.i][1] in ['sepia','traits_noirs','peu_couleur','peinture_huile',\
  2813. 'gamma','fonce_clair','peinture_eau','bas_relief']:
  2814.  
  2815. spin = str(self.listeComboReglage[self.i][3].spin.value())
  2816.  
  2817. if self.listeComboReglage[self.i][1]=='sepia':
  2818. # Uniquement pour Linux et MacOSX
  2819. if os.name in ['posix', 'mac']:
  2820. self.process.start("convert -sepia-tone "+spin+"% "+"\""+self.listeImgSource[self.j]+"\""+' '+"\""+self.cheminCourantSauv+"\"")
  2821. # Uniquement pour windows
  2822. elif os.name == 'nt':
  2823. for self.j in self.listeIndex:
  2824. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  2825. os.system("convert -sepia-tone "+spin+"% "+"\""+self.listeImgSource[self.j]+"\""+' '+"\""+self.cheminCourantSauv+"\"")
  2826. if not self.opReccurApresApp(): return
  2827.  
  2828. elif self.listeComboReglage[self.i][1]=='traits_noirs':
  2829. # Uniquement pour Linux et MacOSX
  2830. if os.name in ['posix', 'mac']:
  2831. self.process.start("convert -charcoal "+spin+" -monochrome "+"\""+self.listeImgSource[self.j]+"\" "+"\""+self.cheminCourantSauv+"\"")
  2832. # Uniquement pour windows
  2833. elif os.name == 'nt':
  2834. for self.j in self.listeIndex:
  2835. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  2836. os.system("convert -charcoal "+spin+" -monochrome "+"\""+self.listeImgSource[self.j]+"\""+' '+"\""+self.cheminCourantSauv+"\"")
  2837. if not self.opReccurApresApp(): return
  2838.  
  2839. elif self.listeComboReglage[self.i][1]=='peu_couleur':
  2840. # Uniquement pour Linux et MacOSX
  2841. if os.name in ['posix', 'mac']:
  2842. self.process.start("convert -enhance -equalize -edge "+spin+" -colorize 6,12,20 "+"\""+self.listeImgSource[self.j]+"\" "+"\""+self.cheminCourantSauv+"\"")
  2843. # Uniquement pour windows
  2844. elif os.name == 'nt':
  2845. for self.j in self.listeIndex:
  2846. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  2847. os.system("convert -enhance -equalize -edge "+spin+" -colorize 6,12,20 "+"\""+self.listeImgSource[self.j]+"\""+' '+"\""+self.cheminCourantSauv+"\"")
  2848. if not self.opReccurApresApp(): return
  2849.  
  2850. elif self.listeComboReglage[self.i][1]=='peinture_huile':
  2851. # Uniquement pour Linux et MacOSX
  2852. if os.name in ['posix', 'mac']:
  2853. self.process.start("convert -paint "+spin+" \""+self.listeImgSource[self.j]+"\" "+"\""+self.cheminCourantSauv+"\"")
  2854. # Uniquement pour windows
  2855. elif os.name == 'nt':
  2856. for self.j in self.listeIndex:
  2857. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  2858. os.system("convert -paint "+spin+' '+"\""+self.listeImgSource[self.j]+"\""+' '+"\""+self.cheminCourantSauv+"\"")
  2859. if not self.opReccurApresApp(): return
  2860.  
  2861. elif self.listeComboReglage[self.i][1]=='gamma':
  2862. # Uniquement pour Linux et MacOSX
  2863. if os.name in ['posix', 'mac']:
  2864. self.process.start("convert -gamma "+spin+" \""+self.listeImgSource[self.j]+"\" "+"\""+self.cheminCourantSauv+"\"")
  2865. # Uniquement pour windows
  2866. elif os.name == 'nt':
  2867. for self.j in self.listeIndex:
  2868. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  2869. os.system("convert -gamma "+spin+' '+"\""+self.listeImgSource[self.j]+"\""+' '+"\""+self.cheminCourantSauv+"\"")
  2870. if not self.opReccurApresApp(): return
  2871.  
  2872. elif self.listeComboReglage[self.i][1]=='fonce_clair':
  2873. # Uniquement pour Linux et MacOSX
  2874. if os.name in ['posix', 'mac']:
  2875. self.process.start("convert -modulate "+spin+" \""+self.listeImgSource[self.j]+"\" "+"\""+self.cheminCourantSauv+"\"")
  2876. # Uniquement pour windows
  2877. elif os.name == 'nt':
  2878. for self.j in self.listeIndex:
  2879. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  2880. os.system("convert -modulate "+spin+" \""+self.listeImgSource[self.j]+"\""+' '+"\""+self.cheminCourantSauv+"\"")
  2881. if not self.opReccurApresApp(): return
  2882.  
  2883. elif self.listeComboReglage[self.i][1]=='peinture_eau':
  2884. # Uniquement pour Linux et MacOSX
  2885. if os.name in ['posix', 'mac']:
  2886. self.process.start("convert -noise "+spin+" -gamma 1.4 "+"\""+self.listeImgSource[self.j]+"\" "+"\""+self.cheminCourantSauv+"\"")
  2887. # Uniquement pour windows
  2888. elif os.name == 'nt':
  2889. for self.j in self.listeIndex:
  2890. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  2891. os.system("convert -noise "+spin+" -gamma 1.4 "+"\""+self.listeImgSource[self.j]+"\""+' '+"\""+self.cheminCourantSauv+"\"")
  2892. if not self.opReccurApresApp(): return
  2893.  
  2894. elif self.listeComboReglage[self.i][1]=='bas_relief':
  2895. # Uniquement pour Linux et MacOSX
  2896. if os.name in ['posix', 'mac']:
  2897. self.process.start("convert -paint "+spin+" -shade 120x45 "+"\""+self.listeImgSource[self.j]+"\" "+"\""+self.cheminCourantSauv+"\"")
  2898. # Uniquement pour windows
  2899. elif os.name == 'nt':
  2900. for self.j in self.listeIndex:
  2901. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  2902. os.system("convert -paint "+spin+" -shade 120x45 "+"\""+self.listeImgSource[self.j]+"\""+' '+"\""+self.cheminCourantSauv+"\"")
  2903. if not self.opReccurApresApp(): return
  2904.  
  2905. elif self.listeComboReglage[self.i][1] in ['crayon_papier','floutage','trait_couleur_fond_noir']:
  2906.  
  2907. spin1 = str(self.listeComboReglage[self.i][3].spin1.value())
  2908. spin2 = str(self.listeComboReglage[self.i][3].spin2.value())
  2909.  
  2910. if self.listeComboReglage[self.i][1]=='crayon_papier':
  2911. # Uniquement pour Linux et MacOSX
  2912. if os.name in ['posix', 'mac']:
  2913. self.process.start("convert -spread "+spin2+" -charcoal "+spin1+" \""+self.listeImgSource[self.j]+"\" "+"\""+self.cheminCourantSauv+"\"")
  2914. # Uniquement pour windows
  2915. elif os.name == 'nt':
  2916. for self.j in self.listeIndex:
  2917. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  2918. os.system("convert -spread "+spin2+" -charcoal "+spin1+' '+"\""+self.listeImgSource[self.j]+"\""+' '+"\""+self.cheminCourantSauv+"\"")
  2919. if not self.opReccurApresApp(): return
  2920.  
  2921. elif self.listeComboReglage[self.i][1]=='floutage':
  2922. # Uniquement pour Linux et MacOSX
  2923. if os.name in ['posix', 'mac']:
  2924. self.process.start("convert -blur "+spin1+'%'+'x'+spin2+"% "+"\""+self.listeImgSource[self.j]+"\" "+"\""+self.cheminCourantSauv+"\"")
  2925. # Uniquement pour windows
  2926. elif os.name == 'nt':
  2927. for self.j in self.listeIndex:
  2928. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  2929. os.system("convert -blur "+spin1+'%'+'x'+spin2+"% "+"\""+self.listeImgSource[self.j]+"\""+' '+"\""+self.cheminCourantSauv+"\"")
  2930. if not self.opReccurApresApp(): return
  2931.  
  2932. elif self.listeComboReglage[self.i][1]=='trait_couleur_fond_noir':
  2933. # Uniquement pour Linux et MacOSX
  2934. if os.name in ['posix', 'mac']:
  2935. self.process.start("convert -median "+spin1+" -edge "+spin2+" \""+self.listeImgSource[self.j]+"\" "+"\""+self.cheminCourantSauv+"\"")
  2936. # Uniquement pour windows
  2937. elif os.name == 'nt':
  2938. for self.j in self.listeIndex:
  2939. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  2940. os.system("convert -median "+spin1+" -edge "+spin2+' '+"\""+self.listeImgSource[self.j]+"\""+' '+"\""+self.cheminCourantSauv+"\"")
  2941. if not self.opReccurApresApp(): return
  2942.  
  2943. elif self.listeComboReglage[self.i][1]=='monochrome':
  2944. # Uniquement pour Linux et MacOSX
  2945. if os.name in ['posix', 'mac']:
  2946. self.process.start("convert -monochrome "+"\""+self.listeImgSource[self.j]+"\" "+"\""+self.cheminCourantSauv+"\"")
  2947. # Uniquement pour windows
  2948. elif os.name == 'nt':
  2949. for self.j in self.listeIndex:
  2950. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  2951. os.system("convert -monochrome "+"\""+self.listeImgSource[self.j]+"\""+' '+"\""+self.cheminCourantSauv+"\"")
  2952. if not self.opReccurApresApp(): return
  2953.  
  2954. elif self.listeComboReglage[self.i][1]=='pointillisme':
  2955.  
  2956. indexCombo = self.listeComboReglage[self.i][3].combo.currentIndex()
  2957. entreeCombo = str(self.listeComboReglage[self.i][3].combo.itemData(indexCombo).toStringList()[0])
  2958.  
  2959. # Uniquement pour Linux et MacOSX
  2960. if os.name in ['posix', 'mac']:
  2961. self.process.start("convert +noise "+entreeCombo+" "+"\""+self.listeImgSource[self.j]+"\" "+"\""+self.cheminCourantSauv+"\"")
  2962. # Uniquement pour windows
  2963. elif os.name == 'nt':
  2964. for self.j in self.listeIndex:
  2965. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  2966. os.system("convert +noise "+entreeCombo+' '+"\""+self.listeImgSource[self.j]+"\""+' '+"\""+self.cheminCourantSauv+"\"")
  2967. if not self.opReccurApresApp(): return
  2968.  
  2969. elif self.listeComboReglage[self.i][1]=='craie_blanche':
  2970. # Uniquement pour Linux et MacOSX
  2971. if os.name in ['posix', 'mac']:
  2972. self.process.start("convert -blur 2x2 -fx 'log(r*60*pi)' -edge 0.1 -blur 2x2 "+"\""+self.listeImgSource[self.j]+"\" "+"\""+self.cheminCourantSauv+"\"")
  2973. # Uniquement pour windows
  2974. elif os.name == 'nt':
  2975. for self.j in self.listeIndex:
  2976. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  2977. os.system("convert -blur 2x2 -fx 'log(r*60*pi)' -edge 0.1 -blur 2x2 "+"\""+self.listeImgSource[self.j]+"\""+' '+"\""+self.cheminCourantSauv+"\"")
  2978. if not self.opReccurApresApp(): return
  2979.  
  2980. #------------------------------
  2981. # Gestion par G'MIC
  2982. #------------------------------
  2983.  
  2984. # Mise en place de conditions pour linux et windows
  2985. # Attention dans la version windows ce n'est pas traité par un QProcess (comme sous
  2986. # Linux) mais directement avec os.system (pour l'instant, test pas encore fait pour
  2987. # savoir si ça fonctionne bien avec QProcess --> A FAIRE)
  2988.  
  2989. # Sous windows process.start(...) est désactivé POUR L'INSTANT, os.system(...) est
  2990. # utilisé à la place.
  2991.  
  2992. # Le code est plus long que dans la version Linux --> la boucle a été rajoutée ds
  2993. # chaque choix pour les filtres dépendant de G'MIC.
  2994.  
  2995. ### ATTENTION ######################################################################
  2996. # "\"" a été remplacé par "\\\"" car G'MIC demande une syntaxe du style:
  2997. # gmic \"mon nom de fichier avec espace.jpg\" ... pour pouvoir traiter des fichiers
  2998. # avec des espaces dans son nom
  2999. ####################################################################################
  3000.  
  3001. ####################################################################################
  3002. # Momentanément importé (bug d'affichage)
  3003. import locale
  3004. ####################################################################################
  3005.  
  3006.  
  3007. ########Rajout le 4/02/2011 par LUCAS Thomas et CABANA Antoine##################
  3008. if self.listeComboReglage[self.i][1] in ['dessin_13_couleur', 'crayon_papier_2', 'oeilleton', 'polaroid', 'vieille_photo', 'cubisme_analytique', 'andy_warhol', 'expressionnisme', 'correct_yeux_rouges', 'solarisation', 'bull_en_tableau', 'la_planete_1', 'vision_thermique','enflamme','predator']:
  3009. ################################################################################
  3010.  
  3011.  
  3012. if self.listeComboReglage[self.i][1]=='dessin_13_couleur':
  3013. #################################################
  3014. # Pour Dessin 13: couleur:
  3015. # ------------------------
  3016. # spin1 --> Amplitude
  3017. #################################################
  3018. spin1 = self.listeComboReglage[self.i][3].spin1.value()
  3019. spin1 = str(spin1/100)
  3020. # Uniquement pour Linux et MacOSX
  3021. if os.name in ['posix', 'mac']:
  3022. ###############################################################################
  3023. ## On passe par ce traitement sous Linux et MacOSX car pour l'instant il y a ##
  3024. ### un bug d'affichage (à la fin du rendu et dans l'onglet Images après ##
  3025. ### traitement). ##
  3026. for self.j in self.listeIndex:
  3027. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3028. os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -drawing "+spin1+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  3029. if not self.opReccurApresApp(): return
  3030. ###############################################################################
  3031. # Momentanément désactivé le temps de trouver une solution au bug d'affichage
  3032. #self.process.start("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -drawing "+spin1+" -o "+"\\\""+self.cheminCourantSauv+"\\\"")
  3033. # Uniquement pour windows
  3034. elif os.name == 'nt':
  3035. for self.j in self.listeIndex:
  3036. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3037. os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -drawing "+spin1+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  3038. if not self.opReccurApresApp(): return
  3039.  
  3040. if self.listeComboReglage[self.i][1]=='crayon_papier_2':
  3041. #################################################
  3042. # Pour Dessin 14: crayon à papier 2:
  3043. # ----------------------------------
  3044. # spin1 --> Amplitude
  3045. #################################################
  3046. spin1 = self.listeComboReglage[self.i][3].spin1.value()
  3047. spin1 = str(spin1/10)
  3048. # Uniquement pour Linux et MacOSX
  3049. if os.name in ['posix', 'mac']:
  3050. ###############################################################################
  3051. ## On passe par ce traitement sous Linux et MacOSX car pour l'instant il y a ##
  3052. ### un bug d'affichage (à la fin du rendu et dans l'onglet Images après ##
  3053. ### traitement). ##
  3054. for self.j in self.listeIndex:
  3055. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3056. os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -pencilbw "+spin1+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  3057. if not self.opReccurApresApp(): return
  3058. ###############################################################################
  3059. # Momentanément désactivé le temps de trouver une solution au bug d'affichage
  3060. #self.process.start("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -pencilbw "+spin1+" -o "+"\\\""+self.cheminCourantSauv+"\\\"")
  3061. # Uniquement pour windows
  3062. elif os.name == 'nt':
  3063. for self.j in self.listeIndex:
  3064. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3065. os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -pencilbw "+spin1+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  3066. if not self.opReccurApresApp(): return
  3067.  
  3068. if self.listeComboReglage[self.i][1]=='correct_yeux_rouges':
  3069. # Il faut passer par if au lieu de elif ici pour que cela fonctionne bien
  3070. #elif self.listeComboReglage[self.i][1]=='correct_yeux_rouges':
  3071. #################################################
  3072. # Pour Correction des yeux rouges:
  3073. # --------------------------------
  3074. # spin1 --> Seuil des couleurs
  3075. # spin2 --> Lissage
  3076. # spin3 --> Atténuation
  3077. #################################################
  3078. spin1 = self.listeComboReglage[self.i][3].spin1.value()
  3079. # Si spin1 réglé sur 1 en fait spin vaut 0
  3080. if spin1 == 1: spin1 = 0
  3081. # Si la valeur de spin1 est supérieure à 1 on retranche 1
  3082. if spin1 > 1: spin1 = spin1 - 1
  3083. spin1 = str(spin1)
  3084. spin2 = self.listeComboReglage[self.i][3].spin2.value()
  3085. spin2 = str(spin2/10.0)
  3086. spin3 = self.listeComboReglage[self.i][3].spin3.value()
  3087. spin3 = str(spin3/10.0)
  3088. # Uniquement pour Linux et MacOSX
  3089. if os.name in ['posix', 'mac']:
  3090. ###############################################################################
  3091. ## On passe par ce traitement sous Linux et MacOSX car pour l'instant il y a ##
  3092. ### un bug d'affichage (à la fin du rendu et dans l'onglet Images après ##
  3093. ### traitement). ##
  3094. for self.j in self.listeIndex:
  3095. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3096. os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -red_eye "+spin1+','+spin2+','+spin3+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  3097. if not self.opReccurApresApp(): return
  3098. ###############################################################################
  3099. # Momentanément désactivé le temps de trouver une solution au bug d'affichage
  3100. #self.process.start("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -red_eye "+spin1+','+spin2+','+spin3+" -o "+"\\\""+self.cheminCourantSauv+"\\\"")
  3101. # Uniquement pour windows
  3102. elif os.name == 'nt':
  3103. for self.j in self.listeIndex:
  3104. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3105. os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -red_eye "+spin1+','+spin2+','+spin3+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  3106. if not self.opReccurApresApp(): return
  3107.  
  3108. if self.listeComboReglage[self.i][1]=='solarisation':
  3109. # Il faut passer par if au lieu de elif ici pour que cela fonctionne bien
  3110. #elif self.listeComboReglage[self.i][1]=='solarisation':
  3111. # Uniquement pour Linux et MacOSX
  3112. if os.name in ['posix', 'mac']:
  3113. ###############################################################################
  3114. ## On passe par ce traitement sous Linux et MacOSX car pour l'instant il y a ##
  3115. ### un bug d'affichage (à la fin du rendu et dans l'onglet Images après ##
  3116. ### traitement). ##
  3117. for self.j in self.listeIndex:
  3118. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3119. os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -solarize -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  3120. if not self.opReccurApresApp(): return
  3121. ###############################################################################
  3122. # Momentanément désactivé le temps de trouver une solution au bug d'affichage
  3123. #self.process.start("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -solarize -o "+"\\\""+self.cheminCourantSauv+"\\\"")
  3124. # Uniquement pour windows
  3125. elif os.name == 'nt':
  3126. for self.j in self.listeIndex:
  3127. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3128. os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -solarize -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  3129. if not self.opReccurApresApp(): return
  3130.  
  3131. if self.listeComboReglage[self.i][1]=='oeilleton':
  3132. #################################################
  3133. # Pour Oeilleton:
  3134. # ---------------
  3135. # spin1 --> Position sur la largeur
  3136. # spin2 --> Position sur la hauteur
  3137. # spin3 --> Rayon
  3138. # spin4 --> Amplitude
  3139. #################################################
  3140. spin1 = str(self.listeComboReglage[self.i][3].spin1.value())
  3141. spin2 = str(self.listeComboReglage[self.i][3].spin2.value())
  3142. spin3 = str(self.listeComboReglage[self.i][3].spin3.value())
  3143. spin4 = str(self.listeComboReglage[self.i][3].spin4.value())
  3144. # Uniquement pour Linux et MacOSX
  3145. if os.name in ['posix', 'mac']:
  3146. ###############################################################################
  3147. ## On passe par ce traitement sous Linux et MacOSX car pour l'instant il y a ##
  3148. ### un bug d'affichage (à la fin du rendu et dans l'onglet Images après ##
  3149. ### traitement). ##
  3150. for self.j in self.listeIndex:
  3151. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3152. os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -fish_eye "+spin1+','+spin2+','+spin3+','+spin4+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  3153. if not self.opReccurApresApp(): return
  3154. ###############################################################################
  3155. # Momentanément désactivé le temps de trouver une solution au bug d'affichage
  3156. #self.process.start("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -fish_eye "+spin1+','+spin2+','+spin3+','+spin4+" -o "+"\\\""+self.cheminCourantSauv+"\\\"")
  3157. # Uniquement pour windows
  3158. elif os.name == 'nt':
  3159. for self.j in self.listeIndex:
  3160. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3161. os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -fish_eye "+spin1+','+spin2+','+spin3+','+spin4+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  3162. if not self.opReccurApresApp(): return
  3163.  
  3164. if self.listeComboReglage[self.i][1]=='polaroid':
  3165. #################################################
  3166. # Pour Polaroïd:
  3167. # --------------
  3168. # spin1 --> Taille de la bordure
  3169. # spin2 --> Taille en largeur pour l'ombre
  3170. # spin3 --> Taille en hauteur pour l'ombre
  3171. # spin4 --> Rotation (en degrés) de la photo
  3172. #################################################
  3173. spin1 = str(self.listeComboReglage[self.i][3].spin1.value())
  3174. spin2 = str(self.listeComboReglage[self.i][3].spin2.value())
  3175. spin3 = str(self.listeComboReglage[self.i][3].spin3.value())
  3176. spin4 = str(self.listeComboReglage[self.i][3].spin4.value())
  3177. # Uniquement pour Linux et MacOSX
  3178. if os.name in ['posix', 'mac']:
  3179. ###############################################################################
  3180. ## On passe par ce traitement sous Linux et MacOSX car pour l'instant il y a ##
  3181. ### un bug d'affichage (à la fin du rendu et dans l'onglet Images après ##
  3182. ### traitement). ##
  3183. for self.j in self.listeIndex:
  3184. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3185. os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -polaroid "+spin1+" -drop_shadow "+spin2+','+spin3+" -rotate "+spin4+",1 -drgba -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  3186. if not self.opReccurApresApp(): return
  3187. ###############################################################################
  3188. # Momentanément désactivé le temps de trouver une solution au bug d'affichage
  3189. #self.process.start("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -polaroid "+spin1+" -drop_shadow "+spin2+','+spin3+" -rotate "+spin4+",1 -drgba -o "+"\\\""+self.cheminCourantSauv+"\\\"")
  3190. # Uniquement pour windows
  3191. elif os.name == 'nt':
  3192. for self.j in self.listeIndex:
  3193. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3194. os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -polaroid "+spin1+" -drop_shadow "+spin2+','+spin3+" -rotate "+spin4+",1 -drgba -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  3195. if not self.opReccurApresApp(): return
  3196.  
  3197. if self.listeComboReglage[self.i][1]=='vieille_photo':
  3198. #################################################
  3199. # Pour Vieille photo:
  3200. # -------------------
  3201. # spin1 --> Taille en largeur pour l'ombre
  3202. # spin2 --> Taille en hauteur pour l'ombre
  3203. # spin3 --> Rotation (en degrés) de la photo
  3204. #################################################
  3205. spin1 = str(self.listeComboReglage[self.i][3].spin1.value())
  3206. spin2 = str(self.listeComboReglage[self.i][3].spin2.value())
  3207. spin3 = str(self.listeComboReglage[self.i][3].spin3.value())
  3208. # Uniquement pour Linux et MacOSX
  3209. if os.name in ['posix', 'mac']:
  3210. ###############################################################################
  3211. ## On passe par ce traitement sous Linux et MacOSX car pour l'instant il y a ##
  3212. ### un bug d'affichage (à la fin du rendu et dans l'onglet Images après ##
  3213. ### traitement). ##
  3214. for self.j in self.listeIndex:
  3215. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3216. os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -old_photo -drop_shadow "+spin1+','+spin2+" -rotate "+spin3+",1 -drgba -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  3217. if not self.opReccurApresApp(): return
  3218. ###############################################################################
  3219. # Momentanément désactivé le temps de trouver une solution au bug d'affichage
  3220. #self.process.start("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -old_photo -drop_shadow "+spin1+','+spin2+" -rotate "+spin3+",1 -drgba -o "+"\\\""+self.cheminCourantSauv+"\\\"")
  3221. # Uniquement pour windows
  3222. elif os.name == 'nt':
  3223. for self.j in self.listeIndex:
  3224. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3225. os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -old_photo -drop_shadow "+spin1+','+spin2+" -rotate "+spin3+",1 -drgba -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  3226.  
  3227. if self.listeComboReglage[self.i][1]=='cubisme_analytique':
  3228. #################################################
  3229. # Pour Cubisme analytique:
  3230. # ------------------------
  3231. # spin1 --> Itération
  3232. # spin2 --> Taille de bloc
  3233. # spin3 --> Angle
  3234. #################################################
  3235. spin1 = str(self.listeComboReglage[self.i][3].spin1.value())
  3236. spin2 = str(self.listeComboReglage[self.i][3].spin2.value())
  3237. spin3 = str(self.listeComboReglage[self.i][3].spin3.value())
  3238. # Uniquement pour Linux et MacOSX
  3239. if os.name in ['posix', 'mac']:
  3240. ###############################################################################
  3241. ## On passe par ce traitement sous Linux et MacOSX car pour l'instant il y a ##
  3242. ### un bug d'affichage (à la fin du rendu et dans l'onglet Images après ##
  3243. ### traitement). ##
  3244. for self.j in self.listeIndex:
  3245. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3246. #self.process = EkdProcess(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -cubism "+spin1+','+spin2+','+spin3+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]), output = None, stdinput = None)
  3247. os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -cubism "+spin1+','+spin2+','+spin3+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  3248. if not self.opReccurApresApp(): return
  3249. ###############################################################################
  3250. # Momentanément désactivé le temps de trouver une solution au bug d'affichage
  3251. #self.process.start("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -cubism "+spin1+','+spin2+','+spin3+" -o "+"\\\""+self.cheminCourantSauv+"\\\"")
  3252. # Uniquement pour windows
  3253. elif os.name == 'nt':
  3254. for self.j in self.listeIndex:
  3255. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3256. os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -cubism "+spin1+','+spin2+','+spin3+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  3257. if not self.opReccurApresApp(): return
  3258.  
  3259. if self.listeComboReglage[self.i][1]=='andy_warhol':
  3260. # Il faut passer par if au lieu de elif ici pour que cela fonctionne bien
  3261. #elif self.listeComboReglage[self.i][1]=='andy_warhol':
  3262. #################################################
  3263. # Pour Andy Warhol:
  3264. # -----------------
  3265. # spin1 --> Nombre d'images par ligne
  3266. # spin2 --> Nombre d'images par colonne
  3267. # spin3 --> Lissage
  3268. # spin4 --> Couleur
  3269. #################################################
  3270. spin1 = str(self.listeComboReglage[self.i][3].spin1.value())
  3271. spin2 = str(self.listeComboReglage[self.i][3].spin2.value())
  3272. spin3 = str(self.listeComboReglage[self.i][3].spin3.value())
  3273. spin4 = str(self.listeComboReglage[self.i][3].spin4.value())
  3274. # Uniquement pour Linux et MacOSX
  3275. if os.name in ['posix', 'mac']:
  3276. ###############################################################################
  3277. ## On passe par ce traitement sous Linux et MacOSX car pour l'instant il y a ##
  3278. ### un bug d'affichage (à la fin du rendu et dans l'onglet Images après ##
  3279. ### traitement). ##
  3280. for self.j in self.listeIndex:
  3281. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3282. os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -warhol "+spin1+','+spin2+','+spin3+','+spin4+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  3283. if not self.opReccurApresApp(): return
  3284. ###############################################################################
  3285. # Momentanément désactivé le temps de trouver une solution au bug d'affichage
  3286. #self.process.start("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -warhol "+spin1+','+spin2+','+spin3+','+spin4+" -o "+"\\\""+self.cheminCourantSauv+"\\\"")
  3287. # Uniquement pour windows
  3288. elif os.name == 'nt':
  3289. for self.j in self.listeIndex:
  3290. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3291. os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -warhol "+spin1+','+spin2+','+spin3+','+spin4+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  3292. if not self.opReccurApresApp(): return
  3293.  
  3294. if self.listeComboReglage[self.i][1]=='expressionnisme':
  3295. # Il faut passer par if au lieu de elif ici pour que cela fonctionne bien
  3296. #elif self.listeComboReglage[self.i][1]=='expressionnisme':
  3297. #################################################
  3298. # Pour Expressionnisme:
  3299. # ---------------------
  3300. # spin1 --> Abstraction
  3301. # spin2 --> Lissage
  3302. # spin3 --> Couleur
  3303. #################################################
  3304. spin1 = str(self.listeComboReglage[self.i][3].spin1.value())
  3305. spin2 = self.listeComboReglage[self.i][3].spin2.value()
  3306. spin2 = str(spin2/100)
  3307. spin3 = self.listeComboReglage[self.i][3].spin3.value()
  3308. spin3 = str(spin3/100)
  3309. # Uniquement pour Linux et MacOSX
  3310. if os.name in ['posix', 'mac']:
  3311. ###############################################################################
  3312. ## On passe par ce traitement sous Linux et MacOSX car pour l'instant il y a ##
  3313. ### un bug d'affichage (à la fin du rendu et dans l'onglet Images après ##
  3314. ### traitement). ##
  3315. for self.j in self.listeIndex:
  3316. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3317. os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -gimp_painting "+spin1+','+spin2+','+spin3+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  3318. if not self.opReccurApresApp(): return
  3319. ###############################################################################
  3320. # Momentanément désactivé le temps de trouver une solution au bug d'affichage
  3321. #self.process.start("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -gimp_painting "+spin1+','+spin2+','+spin3+" -o "+"\\\""+self.cheminCourantSauv+"\\\"")
  3322. # Uniquement pour windows
  3323. elif os.name == 'nt':
  3324. for self.j in self.listeIndex:
  3325. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3326. os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -gimp_painting "+spin1+','+spin2+','+spin3+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  3327. if not self.opReccurApresApp(): return
  3328.  
  3329. if self.listeComboReglage[self.i][1]=='bull_en_tableau':
  3330. # Il faut passer par if au lieu de elif ici pour que cela fonctionne bien
  3331. #elif self.listeComboReglage[self.i][1]=='bull_en_tableau':
  3332. #################################################
  3333. # Pour Bulles en tableau:
  3334. # -----------------------
  3335. # spin1 --> Résolution en X
  3336. # spin2 --> Résolution en Y
  3337. # spin3 --> Rayon de la bulle
  3338. # spin4 --> Bulles par ligne
  3339. # spin5 --> Bulles par colonne
  3340. # spin6 --> Largeur de la bordure
  3341. # spin7 --> Hauteur de la bordure
  3342. # spin8 --> Largeur finale de l'image
  3343. # spin9 --> Hauteur finale de l'image
  3344. #################################################
  3345. spin1 = str(self.listeComboReglage[self.i][3].spin1.value())
  3346. spin2 = str(self.listeComboReglage[self.i][3].spin2.value())
  3347. spin3 = str(self.listeComboReglage[self.i][3].spin3.value())
  3348. spin4 = str(self.listeComboReglage[self.i][3].spin4.value())
  3349. spin5 = str(self.listeComboReglage[self.i][3].spin5.value())
  3350. spin6 = str(self.listeComboReglage[self.i][3].spin6.value())
  3351. spin7 = str(self.listeComboReglage[self.i][3].spin7.value())
  3352. spin8 = str(self.listeComboReglage[self.i][3].spin8.value())
  3353. spin9 = str(self.listeComboReglage[self.i][3].spin9.value())
  3354. # Uniquement pour Linux et MacOSX
  3355. if os.name in ['posix', 'mac']:
  3356. ###############################################################################
  3357. ## On passe par ce traitement sous Linux et MacOSX car pour l'instant il y a ##
  3358. ### un bug d'affichage (à la fin du rendu et dans l'onglet Images après ##
  3359. ### traitement). ##
  3360. for self.j in self.listeIndex:
  3361. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3362. os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -mirror z -map_sphere "+spin1+','+spin2+','+spin3+" -array_fade "+spin4+','+spin5+" -frame_fuzzy "+spin6+','+spin7+" -resize "+spin8+','+spin9+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  3363. if not self.opReccurApresApp(): return
  3364. ###############################################################################
  3365. # Momentanément désactivé le temps de trouver une solution au bug d'affichage
  3366. #self.process.start("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -mirror z -map_sphere "+spin1+','+spin2+','+spin3+" -array_fade "+spin4+','+spin5+" -frame_fuzzy "+spin6+','+spin7+" -resize "+spin8+','+spin9+" -o "+"\\\""+self.cheminCourantSauv+"\\\"")
  3367. # Uniquement pour windows
  3368. elif os.name == 'nt':
  3369. for self.j in self.listeIndex:
  3370. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3371. os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -mirror z -map_sphere "+spin1+','+spin2+','+spin3+" -array_fade "+spin4+','+spin5+" -frame_fuzzy "+spin6+','+spin7+" -resize "+spin8+','+spin9+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  3372. if not self.opReccurApresApp(): return
  3373.  
  3374. elif self.listeComboReglage[self.i][1]=='la_planete_1':
  3375. #################################################
  3376. # Pour Bulles en tableau:
  3377. # -----------------------
  3378. # spin1 --> Position des doubles
  3379. # spin2 --> Rayon de la planète
  3380. # spin3 --> Dilatation
  3381. # spin4 --> Largeur finale de l'image
  3382. # spin5 --> Hauteur finale de l'image
  3383. #################################################
  3384. spin1 = str(self.listeComboReglage[self.i][3].spin1.value())
  3385. spin2 = str(self.listeComboReglage[self.i][3].spin2.value())
  3386. spin3 = self.listeComboReglage[self.i][3].spin3.value()
  3387. spin3 = str(spin3/100.0)
  3388. spin4 = str(self.listeComboReglage[self.i][3].spin4.value())
  3389. spin5 = str(self.listeComboReglage[self.i][3].spin5.value())
  3390. # Uniquement pour Linux et MacOSX
  3391. if os.name in ['posix', 'mac']:
  3392. ###############################################################################
  3393. ## On passe par ce traitement sous Linux et MacOSX car pour l'instant il y a ##
  3394. ### un bug d'affichage (à la fin du rendu et dans l'onglet Images après ##
  3395. ### traitement). ##
  3396. for self.j in self.listeIndex:
  3397. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3398. os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -repeat "+spin1+ " --mirror x -a x -done -map_sphere "+spin4+','+spin5+','+spin2+','+spin3+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  3399. if not self.opReccurApresApp(): return
  3400. ###############################################################################
  3401. # Momentanément désactivé le temps de trouver une solution au bug d'affichage
  3402. #self.process.start("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -repeat "+spin1+ " --mirror x -a x -done -map_sphere "+spin4+','+spin5+','+spin2+','+spin3+" -o "+"\\\""+self.cheminCourantSauv+"\\\"")
  3403. # Uniquement pour windows
  3404. elif os.name == 'nt':
  3405. for self.j in self.listeIndex:
  3406. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3407. os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -repeat "+spin1+ " --mirror x -a x -done -map_sphere "+spin4+','+spin5+','+spin2+','+spin3+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  3408. if not self.opReccurApresApp(): return
  3409.  
  3410. ########Rajout le 28/11/2010 par LUCAS Thomas et CABANA Antoine###################################
  3411. elif self.listeComboReglage[self.i][1]=='vision_thermique':
  3412. #################################################
  3413. # Pour Vision Thermique :
  3414. # -----------------------
  3415. # spin1 --> Minimum de Luminance
  3416. # spin2 --> Maximum de Luminance
  3417. #################################################
  3418. spin1 = str(self.listeComboReglage[self.i][3].spin1.value())
  3419. spin2 = str(self.listeComboReglage[self.i][3].spin2.value())
  3420. '''
  3421. if spin1>=spin2:
  3422. erreur=QMessageBox(self)
  3423. erreur.setText(_(u"Attention, <b>la valeur du mini ne doit jamais être supérieure ou égale à la valeur du maxi de la luminance</b>. L'opération demandée ne sera pas effectuée. Refaites vos réglages correctement et recommencez l'opération."))
  3424. erreur.setWindowTitle(_(u"Erreur de réglage"))
  3425. erreur.setIcon(QMessageBox.Warning)
  3426. erreur.exec_()
  3427. sys.exit
  3428. else :
  3429. #spin1 = str(self.listeComboReglage[self.i][3].spin1.value()) # Ce réglage est déjà définis plus haut ds le code
  3430. #spin2 = str(self.listeComboReglage[self.i][3].spin2.value()) # Ce réglage est déjà définis plus haut ds le code
  3431. '''
  3432. # Uniquement pour Linux et MacOSX
  3433. if os.name in ['posix', 'mac']:
  3434. for self.j in self.listeIndex:
  3435. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3436. os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -luminance -n "+spin1+','+spin2+ " -negative -map 1 -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  3437. if not self.opReccurApresApp(): return
  3438.  
  3439. # Uniquement pour windows
  3440. elif os.name == 'nt':
  3441. for self.j in self.listeIndex :
  3442. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3443. os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -luminance -n "+spin1+','+spin2+" -negative -map 1 -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  3444. if not self.opReccurApresApp(): return
  3445. ##########################################################################################
  3446. ########Rajout le 4/02/2011 par LUCAS Thomas et CABANA Antoine##################
  3447. elif self.listeComboReglage[self.i][1]=='enflamme':
  3448. #################################################
  3449. # Pour Enflamme :
  3450. # -----------------------
  3451. # spin1 --> Palette
  3452. # spin2 --> Amplitude
  3453. # spin3 --> Echantillonnage
  3454. # spin4 --> Lissage
  3455. # spin5 --> Opacité
  3456. # spin6 --> Bord
  3457. # spin7 --> Amplitude du lissage anisotropique
  3458. # spin8 --> Netteté
  3459. # spin9 --> Anisotropie
  3460. # spin10 --> Gradiant de lissage
  3461. # spin11 --> Tenseur de lissage
  3462. # spin12 --> Précision spaciale
  3463. # spin13 --> Précision angulaire
  3464. # spin14 --> Valeur de la précision
  3465. # spin15 --> Iterations
  3466. #################################################
  3467.  
  3468.  
  3469. spin1 = str(self.listeComboReglage[self.i][3].spin1.value()-1)
  3470. spin2 = str(self.listeComboReglage[self.i][3].spin2.value())
  3471. spin3 = str(self.listeComboReglage[self.i][3].spin3.value()/100.0)
  3472. spin4 = str(self.listeComboReglage[self.i][3].spin4.value()/100.0)
  3473. spin5 = str(self.listeComboReglage[self.i][3].spin5.value()/100.0)
  3474. spin6 = str(self.listeComboReglage[self.i][3].spin6.value())
  3475. spin7 = str(self.listeComboReglage[self.i][3].spin7.value())
  3476. spin8 = str(self.listeComboReglage[self.i][3].spin8.value()/100.0)
  3477. spin9 = str(self.listeComboReglage[self.i][3].spin9.value()/100.0)
  3478. spin10 = str(self.listeComboReglage[self.i][3].spin10.value()/100.0)
  3479. spin11 = str(self.listeComboReglage[self.i][3].spin11.value()/100.0)
  3480. spin12 = str(self.listeComboReglage[self.i][3].spin12.value()/100.0)
  3481. spin13 = str(self.listeComboReglage[self.i][3].spin13.value())
  3482. spin14 = str(self.listeComboReglage[self.i][3].spin14.value()/100.0)
  3483. spin15 = str(self.listeComboReglage[self.i][3].spin15.value())
  3484.  
  3485. # Uniquement pour Linux et MacOSX
  3486. if os.name in ['posix', 'mac']:
  3487. for self.j in self.listeIndex:
  3488. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3489. os.system(("gmic "+" -m fire2.gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -fire "+spin1+','+spin2+','+spin3+','+spin4+','+spin5+','+spin6+','
  3490. +spin7+','+spin8+','+spin9+','+spin10+','+spin11+','+spin12+','+spin13
  3491. +','+spin14+','+spin15+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  3492. if not self.opReccurApresApp(): return
  3493.  
  3494. # Uniquement pour windows
  3495. elif os.name == 'nt':
  3496. for self.j in self.listeIndex :
  3497. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3498. os.system(("gmic "+" -m fire2.gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -fire "+spin1+','+spin2+','+spin3+','+spin4+','+spin5+','+spin6+','
  3499. +spin7+','+spin8+','+spin9+','+spin10+','+spin11+','+spin12+','+spin13
  3500. +','+spin14+','+spin15+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  3501. if not self.opReccurApresApp(): return
  3502.  
  3503. #################################################################################
  3504.  
  3505. ########Rajout le 7/04/2011 par LUCAS Thomas et CABANA Antoine###################################
  3506. elif self.listeComboReglage[self.i][1]=='predator':
  3507. #################################################
  3508. # Pour Vision Predator :
  3509. # -----------------------
  3510. #################################################
  3511.  
  3512. filename=str(self.listeComboReglage[self.i][3].filename)
  3513. # Uniquement pour Linux et MacOSX
  3514. if os.name in ['posix', 'mac']:
  3515. for self.j in self.listeIndex:
  3516. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3517. os.system(("gmic "+"\\\""+self.listeImgSource[0]+"\\\" "+filename+" -sub[1] [0] -n[1] 0,255 -sub[1] 50% -cut[1] 0,255 -negative[1] -light_relief[1] 0.3,0.001,0.1,0,0.2,0.5,0.5,1,1 -luminance[1] -add[0] [1] -remove[1] -n 0,255 -o[-1] "
  3518.  
  3519. +"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  3520. if not self.opReccurApresApp(): return
  3521.  
  3522. # Uniquement pour windows
  3523. elif os.name == 'nt':
  3524. for self.j in self.listeIndex :
  3525. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3526. os.system(("gmic "+"\\\""+self.listeImgSource[0]+"\\\""+filename+
  3527. "--sub[1] [0] --n[-1] 0,255 -sub[-1] 50% -cut[-1] 0,255 --negative[-1] --light_relief 0.3,0.001,0.1,0,0.2,0.5,0.5,1,1 -luminance[-1] --add[0] [-1] -o[-1] "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
  3528. if not self.opReccurApresApp(): return
  3529. ##########################################################################################
  3530. #--------------------------------------------------------
  3531. # Filtres utilisant notamment un module python (ex. PIL)
  3532. #--------------------------------------------------------
  3533.  
  3534. elif self.listeComboReglage[self.i][1]=='vieux_films':
  3535. self.appliquerVieuxFilms()
  3536.  
  3537. elif self.listeComboReglage[self.i][1]=='illustration_niveau_gris':
  3538. for self.j in self.listeIndex:
  3539. # Sauvegarde
  3540. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3541. obImg = Image.open(self.listeImgSource[self.j])
  3542. convert = obImg.convert("1")
  3543. convert.save(self.cheminCourantSauv)
  3544. if not self.opReccurApresApp(): return
  3545.  
  3546. elif self.listeComboReglage[self.i][1]=='traits_fins&couleur':
  3547. for self.j in self.listeIndex:
  3548. # Sauvegarde
  3549. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3550. obImg = Image.open(self.listeImgSource[self.j])
  3551. convert = obImg.filter(ImageFilter.EDGE_ENHANCE_MORE)
  3552. convert.save(self.cheminCourantSauv)
  3553. if not self.opReccurApresApp(): return
  3554.  
  3555. elif self.listeComboReglage[self.i][1]=='emboss':
  3556. for self.j in self.listeIndex:
  3557. # Sauvegarde
  3558. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3559. obImg = Image.open(self.listeImgSource[self.j])
  3560. convert = obImg.filter(ImageFilter.EMBOSS)
  3561. convert.save(self.cheminCourantSauv)
  3562. if not self.opReccurApresApp(): return
  3563.  
  3564. elif self.listeComboReglage[self.i][1]=='sharpen':
  3565. # Sauvegarde
  3566. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3567. obImg = Image.open(self.listeImgSource[self.j])
  3568. convert = obImg.filter(ImageFilter.SHARPEN)
  3569. convert.save(self.cheminCourantSauv)
  3570. if not self.opReccurApresApp(): return
  3571.  
  3572. elif self.listeComboReglage[self.i][1]=='niveau_gris':
  3573. for self.j in self.listeIndex:
  3574. # Sauvegarde
  3575. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3576. obImg = Image.open(self.listeImgSource[self.j])
  3577. convert = obImg.convert("L")
  3578. convert.save(self.cheminCourantSauv)
  3579. if not self.opReccurApresApp(): return
  3580.  
  3581. elif self.listeComboReglage[self.i][1]=='amelior_des_bords':
  3582. for self.j in self.listeIndex:
  3583. # Sauvegarde
  3584. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3585. obImg = Image.open(self.listeImgSource[self.j])
  3586. # Application de la matrice d'amélioration des bords. Matrice trouvee ici :
  3587. # http://blogs.codes-sources.com/tkfe/archive/2005/04/15/6004.aspx
  3588. convert = obImg.filter(ImageFilter.Kernel((3, 3), (-1, -2, -1, -2, 16, -2, -1, -2, -1)))
  3589. convert.save(self.cheminCourantSauv)
  3590. if not self.opReccurApresApp(): return
  3591.  
  3592. elif self.listeComboReglage[self.i][1]=='debruitage':
  3593. for self.j in self.listeIndex:
  3594. # Sauvegarde
  3595. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3596. obImg = Image.open(self.listeImgSource[self.j])
  3597. # Application de la matrice de débruitage. Attention !!! ne fonctionne pas
  3598. # avec les images GIF (.gif)
  3599. convert = obImg.filter(ImageFilter.Kernel((5, 5), (2, 4, 5, 4, 2, 4, 9, 12, 9, 4, 5, 12, 15, 12, 5, 4, 9, 12, 9, 4, 2, 4, 5, 4, 2)))
  3600. convert.save(self.cheminCourantSauv)
  3601. if not self.opReccurApresApp(): return
  3602.  
  3603. elif self.listeComboReglage[self.i][1]=='evanescence':
  3604. self.appliquerEvanescence()
  3605.  
  3606. elif self.listeComboReglage[self.i][1]=='seuillage':
  3607. self.appliquerSeuillage()
  3608.  
  3609. elif self.listeComboReglage[self.i][1]=='imitation_bd_1':
  3610. self.appliquerImitationBd_1()
  3611.  
  3612. elif self.listeComboReglage[self.i][1]=='negatif':
  3613. self.appliquerNegatif()
  3614.  
  3615. elif self.listeComboReglage[self.i][1]=='encadre_photo':
  3616. self.appliquerEncadrePhoto()
  3617.  
  3618. elif self.listeComboReglage[self.i][1]=='couleurs_predefinies':
  3619. self.appliquerCouleursPredef()
  3620.  
  3621. elif self.listeComboReglage[self.i][1]=='couleurs_personnalisees':
  3622. listeCouleurImgPerso=[]
  3623. for k in range(3):
  3624. for l in range(3):
  3625. listeCouleurImgPerso.append(float('0.'+str(self.listeComboReglage[self.i][3].spin[k][l].value())))
  3626. listeCouleurImgPerso.append(0)
  3627.  
  3628. print listeCouleurImgPerso
  3629.  
  3630. for self.j in self.listeIndex:
  3631. # Sauvegarde
  3632. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3633. obImg=Image.open(self.listeImgSource[self.j])
  3634. convert = obImg.convert("RGB").convert("RGB", listeCouleurImgPerso)
  3635. convert.save(self.cheminCourantSauv)
  3636. if not self.opReccurApresApp(): return
  3637.  
  3638. # Ceci a ete réalisé à partir de: http://www.yourmachines.org/tutorials/mgpy.html
  3639. # et à partir du script example2c.py contenu dans l'archive mgpy.tgz. mgpy
  3640. # ('Motion Graphics in Python' (mgpy)) a été realisé par Simon Yuill en 2006.
  3641. # Une partie du code de example2c.py a été repris ici (avec quelques transformations)
  3642. elif self.listeComboReglage[self.i][1]=='separ_en_modules':
  3643. # Valeurs de taille mini et maxi de la forme
  3644. spin1 = self.listeComboReglage[self.i][3].spin1.value()
  3645. spin2 = self.listeComboReglage[self.i][3].spin2.value()
  3646. # La taille minimum ne doit jamais etre superieure a la taille maximum
  3647. if spin1>=spin2:
  3648. erreur=QMessageBox(self)
  3649. erreur.setText(_(u"Attention, <b>la valeur de taille mini de la forme ne doit jamais être supérieure ou égale à la valeur de la taille maxi de la forme</b>. La conversion demandée ne sera pas effectuée. Refaites vos réglages correctement et recommencez l'opération."))
  3650. erreur.setWindowTitle(_(u"Erreur de réglage"))
  3651. erreur.setIcon(QMessageBox.Warning)
  3652. erreur.exec_()
  3653. sys.exit
  3654. else:
  3655. try:
  3656. # Boucle principale
  3657. for self.j in self.listeIndex:
  3658. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
  3659. # Ouverture des images
  3660. obImg=Image.open(self.listeImgSource[self.j])
  3661. '''
  3662. ############### ERREUR ! ##################################################################
  3663. if obImg.mode=='L':
  3664. erreur=QMessageBox(self)
  3665. erreur.setText(_(u"Vous ne pouvez pas travailler avec des images en niveaux de gris, c'est le cas de %s. Le traitement va s'arrêter !." % os.path.basename(self.listeImgSource[self.j])))
  3666. erreur.setWindowTitle(_(u"Erreur"))
  3667. erreur.setIcon(QMessageBox.Warning)
  3668. erreur.exec_()
  3669. sys.exit
  3670. return 0
  3671. ###########################################################################################
  3672. '''
  3673. # Taille des images
  3674. width, height=obImg.size
  3675. # Creation de la surface de l'image
  3676. drawImage = ImageDraw.Draw(obImg)
  3677. # Collecte des donnees (pixels)
  3678. pixels = list(obImg.getdata())
  3679. # Travail avec les pixels
  3680. for y in range(0, height, spin1):
  3681. yp = y * width
  3682. for x in range(0, width, spin1):
  3683. xyp = yp + x
  3684. p = pixels[xyp]
  3685. rndSize = random.randint(spin1, spin2)
  3686. x1 = x - rndSize
  3687. y1 = y - rndSize
  3688. x2 = x + rndSize
  3689. y2 = y + rndSize
  3690. drawImage.rectangle((x1, y1, x2, y2), fill=p, outline=(0,0,0))
  3691. obImg.save(self.cheminCourantSauv)
  3692. if not self.opReccurApresApp(): return
  3693.  
  3694. except:
  3695. erreur=QMessageBox(self)
  3696. erreur.setText(_(u"<p>Une (ou plusieurs) des images que vous avez chargé n'a pas le bon mode, en effet, pour ce filtre, EKD ne peut pas travailler avec les images dont le mode est <b>L</b> (il s'agit d'images en niveaux de gris), <b>P</b> (images GIF). Vérifiez le mode de chacune de vos images (et ce dans les onglets <b>Image(s) source</b>), pour ce faire sélectionnez une image et cliquez sur le bouton <b>Infos</b> (dans la fenêtre qui s'ouvre, chacune des images fautives devrait avoir soit <b>L</b> ou soit <b>P</b> indiqué en face du champ <b>Mode</b>). Eliminez chacune de ces images (par le bouton <b>Retirer</b>) et relancez le traitement (par les boutons <b>Voir le résultat</b> ou <b>Appliquer et sauver</b>).</p><p>La première image incriminée par ce problème est <b>%s</b>.</p><p>Le traitement va s'arrêter !.</p>" % os.path.basename(self.listeImgSource[self.j])))
  3697. erreur.setWindowTitle(_(u"Erreur"))
  3698. erreur.setIcon(QMessageBox.Critical)
  3699. erreur.exec_()
  3700. sys.exit
  3701. return 0
  3702.  
  3703. elif self.listeComboReglage[self.i][1]=='omb_lum_a_la_coul':
  3704. self.appliquerOmbreEtLumALaCouleur()
  3705.  
  3706. elif self.listeComboReglage[self.i][1]=='rotation_image':
  3707. self.appliquerRotationImage()
  3708.  
  3709. elif self.listeComboReglage[self.i][1]=='imitation_bd_2':
  3710. self.appliquerImitationBd_2()
  3711.  
  3712. elif self.listeComboReglage[self.i][1]=='laplacien_1':
  3713. self.appliquerLaplacien_1()
  3714.  
  3715. elif self.listeComboReglage[self.i][1]=='contour_et_couleur':
  3716. self.appliquerContourEtCouleur()
  3717.  
  3718. '''
  3719. elif self.listeComboReglage[self.i][1]=='ombre_lumiere':
  3720. for self.j in self.listeIndex:
  3721. self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+1), 6)+self.ext
  3722. process = QProcess(self)
  3723. process.start("convert -fx 'cos(3.22*pi*R)*100' "+"\""+self.listeImgSource[self.j]+"\" "+self.repTampon+"vf_ombre_lumiere")
  3724. if not process.waitForStarted(3000):
  3725. QMessageBox.warning(None, _(u"Erreur"), _(u"Bogue au lancement de la commande"))
  3726. process.waitForFinished(-1)
  3727. obImg = Image.open(self.repTampon+"vf_ombre_lumiere")
  3728. convert = obImg.filter(ImageFilter.SMOOTH_MORE)
  3729. convert.save(self.cheminCourantSauv)
  3730. if not self.opReccurApresApp(): return
  3731. '''
  3732.  
  3733.  
  3734. def afficherAide(self):
  3735. """Boîte de dialogue de l'aide"""
  3736. messageAide=EkdAide(parent=self)
  3737. messageAide.setText(tr(u"<p><b>Vous pouvez ici appliquer des filtres (dans l'ensemble assez différents les uns des autres) sur un lot d'images.</b></p><p>Dans l'onglet <b>'Image(s) source'</b> cliquez sur le bouton <b>Ajouter</b>, une boîte de dialogue apparaît, sur la partie gauche sélectionnez le répertoire (au besoin dépliez les sous-répertoires), allez chercher votre/vos image(s). Si vous voulez sélectionner plusieurs images d'un coup, maintenez la touche <b>CTRL</b> (ou <b>SHIFT</b>) du clavier enfoncée (tout en sélectionnant vos images), cliquez sur <b>Ajouter</b>.</p><p>Dans l'onglet <b>Réglages</b> faites les réglages du <b>'Traitement à partir de l'image (numéro)'</b> et du <b>'Nombre de chiffres après le nom de l'image' <font color='red'>(la plupart du temps les valeurs par défaut suffisent)</font></b>, sélectionnez ensuite votre <b>'Type'</b> de filtre dans la boîte déroulante, faites les réglages par rapport au <b>'Type'</b> choisi. Cliquez sur le bouton <b>'Voir le résultat'</b> (vous voyez à ce moment le résultat de vos réglages sur la première image du lot s'afficher dans l'onglet <b>Images après traitement</b>).</p><p>Une fois tout ceci fait, cliquez sur le bouton <b>'Appliquer et sauver'</b>, sélectionnez le répertoire de sauvegarde, indiquez votre <b>'Nom de fichier'</b>, cliquez sur le bouton <b>'Enregistrer'</b>.</p><p>Si vous faites un clic droit de la souris (sur l'image) dans l'onglet <b>Images après traitement</b>, vous accédez à des paramètres vous permettant différents affichages de la dite image. De même dans cet onglet vous pouvez lancer la visualisation des images par le bouton <b>Lancer le diaporama</b> (le bouton violet avec une flèche blanche vers la droite).</p><p>L'onglet <b>'Infos'</b> vous permet de voir le filtre utilisé, les image(s) chargée(s) et les image(s) convertie(s).</p>"))
  3738. messageAide.show()
  3739.  
  3740.  
  3741. def save(self) :
  3742. self.afficheurImgSource.saveFileLocation(self.idSection)
  3743. EkdConfig.set(self.idSection, u'choixFiltre', unicode(self.comboReglage.currentIndex()))
  3744. EkdConfig.set(self.idSection, u'spin1', unicode(self.spin1valNombres.value()))
  3745. EkdConfig.set(self.idSection, u'spin2', unicode(self.spin2valNombres.value()))
  3746.  
  3747.  
  3748. def load(self) :
  3749. self.afficheurImgSource.loadFileLocation(self.idSection)
  3750. self.comboReglage.setCurrentIndex(int(EkdConfig.get(self.idSection, 'choixFiltre')))
  3751. self.spin1valNombres.setValue(int(EkdConfig.get(self.idSection, 'spin1')))
  3752. self.spin2valNombres.setValue(int(EkdConfig.get(self.idSection, 'spin2')))