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