#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import sys, os, glob, string, Image, ImageFilter, ImageOps, ImageEnhance, ImageDraw
from random import randrange
from numpy import *
from PyQt4.QtCore import *
from PyQt4.QtGui import *
# Module SpinSliders20Possibles rajouté le 16/07/10
from gui_modules_image.image_base import Base, SpinSlider, SpinSliders, SpinSliders20Possibles 
from gui_modules_image.selectWidget import SelectWidget
from gui_modules_lecture.lecture_image import Lecture_VisionImage
from gui_modules_lecture.affichage_image.afficheurImage import VisionneurEvolue
 
# Gestion de la configuration via EkdConfig
from moteur_modules_common.EkdConfig import EkdConfig
# Nouvelle fenêtre d'aide
from gui_modules_common.EkdWidgets import EkdAide
# Nouvelle boite de dialogue pour sauver les fichiers
from gui_modules_common.EkdWidgets import EkdSaveDialog
 
from moteur_modules_common.EkdProcess import EkdProcess
 
class FiltresAvec9Spin(QFrame):
	"""Widget de réglage à 9 boites de spin"""
	def __init__(self, txt1='', txt2=None, parent=None):
        	QFrame.__init__(self)
 
		grid = QGridLayout(self)
		self.vColor = []
		self.spin = [[0]*3,[0]*3,[0]*3]
		for k in range(3):
			x = QLineEdit()
			x.setMinimumHeight(25)
			self.vColor.append(x)
			grid.addWidget(self.vColor[k], 1, k+1)
			for l in range(3):
				self.spin[k][l]=SpinSlider(0, 99, 50, 'couleur_'+str(k+1)+str(l+1), parent)
				self.connect(self.spin[k][l], SIGNAL("valueChanged(int)"), self.updateColor)
				grid.addWidget(self.spin[k][l], k+2, l+1)
		self.updateColor(50)
		grid.addWidget(QLabel(_(u"Couleur n°1")), 0, 1)
		grid.addWidget(QLabel(_(u"Couleur n°2")), 0, 2)
		grid.addWidget(QLabel(_(u"Couleur n°3")), 0, 3)
		grid.addWidget(QLabel(_(u"Rouge")), 2, 0)
		grid.addWidget(QLabel(_(u"Vert")), 3, 0)
		grid.addWidget(QLabel(_(u"Bleu")), 4, 0)
		grid.setAlignment(Qt.AlignCenter)
 
	def updateColor(self, val) :
		for i in range(3) :
			bckcol=QPalette()
			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)))
			#self.vColor[i].setBackgroundRole(QPalette.Base)
			self.vColor[i].setPalette(bckcol)
 
 
 
 
 
class FiltresAvec13Spin(QFrame):
	"""Widget de réglage à 13 boites de spin"""
	def __init__(self, txt1='', txt2=None, parent=None):
        	QFrame.__init__(self)
 
		grid = QGridLayout(self)
		grid.addWidget(QLabel(_(u"Intensite du trait")), 0, 0)
		self.spinTrait = SpinSlider(10,40, 25, 'coul_contour_couleur_00', parent=parent)
		grid.addWidget(self.spinTrait, 0, 1, 1, -1)
		grid.addWidget(QLabel(_(u"Couleur du trait de contour")), 1, 0)
		# Ajout de self.spinTrait à la fin de la liste self.spin pour une meilleure
		# récupération de la valeur de l'intensité du trait dans les fonctions
		# visu_1ere_img et appliquerContourEtCouleur
		self.spin = [[0]*3,[0]*3,[0]*3,[0]*3,self.spinTrait]
		self.vColor = []
		colorTrait = QLineEdit()
		grid.addWidget(colorTrait, 1, 1, 1, -1)
		grid.addWidget(QLabel(_(u"Rouge")), 2, 0)
		grid.addWidget(QLabel(_(u"Vert")), 3, 0)
		grid.addWidget(QLabel(_(u"Bleu")), 4, 0)
		grid.addWidget(QLabel(_(u"Transparence")), 5, 0)
 
		for p in range(4) :
			if p == 3 : coul = 255
			else : coul = 20
			self.spin[p][2]=SpinSlider(0, 255, coul, 'coul_contour_couleur_'+str(p+1)+'3', parent=parent)
			self.connect(self.spin[p][2], SIGNAL("valueChanged(int)"), self.updateColor)
			grid.addWidget(self.spin[p][2], p+2, 1, 1, -1)
 
		for z in range(2) :
			x = QLineEdit()
			x.setMinimumHeight(25)
			self.vColor.append(x)
			grid.addWidget(self.vColor[z], 7, z+1)
 
		self.vColor.append(colorTrait)
 
		for k1 in range(4):			
			for l1 in range(2):
				incrementation=str(k1)+'_'+str(l1)
				# -- Orange avec canal alpha opaque --
				if incrementation=='0_0': coul=92
				elif incrementation=='1_0': coul=125
				elif incrementation=='2_0': coul=188
				elif incrementation=='3_0': coul=255
				# -- Bleu avec canal alpha opaque ----
				elif incrementation=='0_1': coul=201
				elif incrementation=='1_1': coul=157
				elif incrementation=='2_1': coul=205
				elif incrementation=='3_1': coul=255
				self.spin[k1][l1]=SpinSlider(0, 255, coul, 'coul_contour_couleur_'+str(k1+1)+str(l1+1), parent)
				self.connect(self.spin[k1][l1], SIGNAL("valueChanged(int)"), self.updateColor)
				grid.addWidget(self.spin[k1][l1], k1+8, l1+1)
 
 
		self.updateColor(1)
		grid.addWidget(QLabel(_(u"Couleur pour l'ombre")), 6, 1)
		grid.addWidget(QLabel(_(u"Couleur pour la lumière")), 6, 2)
		grid.addWidget(QLabel(_(u"Rouge")), 8, 0)
		grid.addWidget(QLabel(_(u"Vert")), 9, 0)
		grid.addWidget(QLabel(_(u"Bleu")), 10, 0)
		grid.addWidget(QLabel(_(u"Transparence")), 11, 0)
		grid.setAlignment(Qt.AlignCenter)
 
	def updateColor(self, val) :
		for i in range(3) :
			bckcol=QPalette()
			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()))
			self.vColor[i].setPalette(bckcol)
 
 
class FiltresAvec8Spin(QFrame):
	"""Widget de réglage à 6 boites de spin"""
	def __init__(self, txt1='', txt2=None, parent=None):
        	QFrame.__init__(self)
 
		grid = QGridLayout(self)
		self.spin = [[0]*2,[0]*2,[0]*2,[0]*2]
		self.vColor = []
		for z in range(2) :
			x = QLineEdit()
			x.setMinimumHeight(25)
			self.vColor.append(x)
			grid.addWidget(self.vColor[z], 1, z+1)
 
		for k1 in range(4):			
			for l1 in range(2):
				incrementation=str(k1)+'_'+str(l1)
				# -- Orange avec canal alpha opaque --
				if incrementation=='0_0': coul=253
				elif incrementation=='1_0': coul=145
				elif incrementation=='2_0': coul=5
				elif incrementation=='3_0': coul=255
				# -- Bleu avec canal alpha opaque ----
				elif incrementation=='0_1': coul=35
				elif incrementation=='1_1': coul=85
				elif incrementation=='2_1': coul=136
				elif incrementation=='3_1': coul=255
				self.spin[k1][l1]=SpinSlider(0, 255, coul, 'coul_omb_lum_a_la_coul_'+str(k1+1)+str(l1+1), parent)
				self.connect(self.spin[k1][l1], SIGNAL("valueChanged(int)"), self.updateColor)
				grid.addWidget(self.spin[k1][l1], k1+2, l1+1)
 
		self.updateColor(1)
		grid.addWidget(QLabel(_(u"Couleur pour l'ombre")), 0, 1)
		grid.addWidget(QLabel(_(u"Couleur pour la lumière")), 0, 2)
		grid.addWidget(QLabel(_(u"Rouge")), 2, 0)
		grid.addWidget(QLabel(_(u"Vert")), 3, 0)
		grid.addWidget(QLabel(_(u"Bleu")), 4, 0)
		grid.addWidget(QLabel(_(u"Transparence")), 5, 0)
		grid.setAlignment(Qt.AlignCenter)
 
	def updateColor(self, val) :
		for i in range(2) :
			bckcol=QPalette()
			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()))
			self.vColor[i].setPalette(bckcol)
 
########Rajout le 7/04/2011 par LUCAS Thomas et CABANA Antoine##################		
class FiltreAvecFileDialog(QFrame):
	"""..."""
	def __init__(self, txt1='', txt2=None, parent=None):
        	QFrame.__init__(self)
        	self.filename=QString('')
        	hbox = QHBoxLayout(self)
        	self.boutonDialogue = QPushButton("Ouvrir le fichier sur lequel ajouter l'effet",self)
                self.boutonDialogue.move(40, 50)
                self.connect(self.boutonDialogue,SIGNAL("clicked()"),self.ouvrirDialogue)
                hbox.addWidget(self.boutonDialogue)
 
	def ouvrirDialogue(self):
        	self.filename = QFileDialog.getOpenFileName(self, "Ouvrir un fichier","/home","Images (*.png *.gif *.jpg *.jpeg)")
                if self.filename:
              		QMessageBox.information(self,"Fichier",self.trUtf8("Vous avez sélectionné :\n") + self.filename)
 
################################################################################       	
 
class FiltresAvecCombo(QFrame):
	"""Widget de réglage contenant une boite de combo"""
	def __init__(self, txt, liste, identifiant, parent):
        	QFrame.__init__(self)
 
		self.parent = parent
		self.identifiant = identifiant
 
		hbox = QHBoxLayout(self)
		hbox.addWidget(QLabel(txt))
		self.combo = QComboBox()
 
		font =QFont()
		fm = QFontMetricsF(font)
		hauteurIcone = fm.height() - 2 # icones espacées de 2 pixels
 
		for i in liste:
			if len(i)!=3: self.combo.addItem(i[0],QVariant(i[1]))
			else:
				pixmap = QPixmap(hauteurIcone, hauteurIcone)
				color = QColor(i[2][0],i[2][1],i[2][2])
				pixmap.fill(color)
				self.combo.addItem(QIcon(pixmap),i[0],QVariant(i[1]))
		self.connect(self.combo, SIGNAL("currentIndexChanged(int)"), self.changerComboReglage)
		# Affiche l'entrée de la boite de combo inscrite dans un fichier de configuration
		parent.base.valeurComboIni(self.combo, parent.config, parent.idSection, identifiant)
		hbox.addWidget(self.combo)
		hbox.setAlignment(Qt.AlignCenter)
 
	def changerComboReglage(self, i):
		self.parent.config.set(self.parent.idSection, self.identifiant,self.combo.itemData(i).toString())
 
 
class Image_FiltresImage(QWidget):
	"""# -----------------------------------
	# Cadre accueillant les widgets de :
	# Image >> Filtres image
	# -----------------------------------"""
	def __init__(self, statusBar, geometry):
 
        	QWidget.__init__(self)
 
		# ----------------------------
		# Quelques paramètres de base
		# ----------------------------
 
		# Gestion de la configuration via EkdConfig
		self.config=EkdConfig
		# Identifiant du cadre
		self.idSection = "image_filtres_image"
		self.base = Base()
		# Log du terminal
		self.base.printSection(self.idSection)
		# Fonction appelant la fenêtre principale
		self.mainWindowFrameGeometry = geometry
 
		#=== Création des répertoires temporaires ===#
		# Gestion du repertoire tmp avec EkdConfig
		self.repTampon = EkdConfig.getTempDir() + os.sep + 'tampon' + os.sep + 'image_filtres_image' + os.sep
 
		if os.path.isdir(self.repTampon) is False:
        		os.makedirs(self.repTampon)
		if os.path.isdir(self.repTampon+'redim' + os.sep) is False:
        		os.makedirs(self.repTampon+'redim' + os.sep)
 
		# Scan du répertoire tampon /tmp/ekd/tampon/image_filtres_image
		listeRepTemp=glob.glob(self.repTampon+'*.*')
 
		# Epuration/elimination des fichiers tampon contenus
		# dans /tmp/ekd/tampon/image_filtres_image
		if len(listeRepTemp)>0:
			for toutRepTempE in listeRepTemp:
				os.remove(toutRepTempE)
 
		# Scan du répertoire tampon /tmp/ekd/tampon/conv_img_en_video/redim
		listeRepTempRedim=glob.glob(self.repTampon+'redim' + os.sep + '*.*')
 
		# Epuration/elimination des fichiers tampon contenus
		# dans /tmp/ekd/tampon/conv_img_en_video/redim
		if len(listeRepTempRedim)>0:
			for toutRepTempE_Redim in listeRepTempRedim:
				os.remove(toutRepTempE_Redim)
 
		#=== Variable contenant les titres du log ===#
		self.infosImgTitre = []
		txt = _(u"Image(s) chargée(s)")
		a='#'*36
		b = a + '\n# ' + txt + '\n' + a + '\n'
		txt=_(u"Image(s) convertie(s)")
		c = a + '\n# ' + txt + '\n' + a + '\n'
		self.infosImgTitre.append(b)
		self.infosImgTitre.append(c)
 
		#=== Drapeaux ===#
		# Une conversion (même partielle) a-t-elle eu lieu après le chargement des images? (1: vrai)
 
		# Est-ce que des images ont été converties et qu'elles n'ont pas encore été montrées?
		# Marche aussi quand la conversion a été arrêté avant la fin de la 1ère image
		self.conversionImg = 0
		# Est-ce que des images sources ont été modifiées? (c'est-à-dire ajoutées ou supprimées)
		self.modifImageSource = 0
 
		# Identifiant des filtres utilisant partiellement ou intégralement un module python durant la conversion
		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']
 
		# Fonctions communes à plusieurs cadres du module Image
		# Paramètres de configuration
		self.listeImgSource = []
		self.listeImgDestin = []
 
		self.process = QProcess()
		self.connect(self.process, SIGNAL('finished(int)'), self.finConversion)
 
		# Boite d'alignement vertical
		vbox=QVBoxLayout(self)
 
		self.tabwidget=QTabWidget()
 
		#------------------
		# Onglet Réglages
		#------------------
 
		self.framReglage=QFrame()
		vboxReglage=QVBoxLayout(self.framReglage)
 
		#=== Stacked ===#
 
		self.stacked = QStackedWidget()
		self.stacked.setSizePolicy(QSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Fixed))
 
		#=== Instanciation des widgets du stacked  ===#
 
		# Widgets du stacked sans réglage
		stacked_sansReglage = QFrame()
		vboxStacked = QVBoxLayout(stacked_sansReglage)
		txt=_(u"Pas de réglages ici")
		vboxStacked.addWidget(QLabel("<center>%s</center>" %txt))
 
		# Widgets du stacked avec un combo
		liste = [	(_(u"Impulse"),		"impulse"),\
				(_(u"Laplacian"),	"laplacian"),\
				(_(u"Poisson"),		"poisson")]
		stacked_pointillisme = FiltresAvecCombo(_(u"Sélection des couleurs"), liste, 'pointillisme', self)
		liste = [	(_(u"Rouge vif"),		"rouge_vif",		(198,0,0)),\
				(_(u"Rouge primaire"),		"rouge_primaire",	(199,0,101)),\
				(_(u"Vert perroquet"),		"vert_perroquet",	(0,199,0)),\
				(_(u"Vert acide et clair"),	"vert_acide_clair",	(146,198,1)),\
				(_(u"Bleu roi"),		"bleu_roi",		(0,145,254)),\
				(_(u"Bleu indigo"),		"bleu_indigo",		(145,145,255)),\
				(_(u"Bleu turquoise"),		"bleu_turquoise",	(145,255,255)),\
				(_(u"Jaune or"),		"jaune_or",		(234,198,0)),\
				(_(u"Jaune orange"),		"jaune_orange",		(255,197,0)),\
				(_(u"Saumon"),			"saumon",		(234,163,145)),\
				(_(u"Marron très clair"),	"marron_tres_clair",	(205,158,116)),\
				(_(u"Terre argileuse"),		"terre argileuse",	(243,159,123)),\
				(_(u"Gris colore rouge"),	"gris_colore_rouge",	(220,162,161)),\
				(_(u"Gris colore vert"),	"gris_colore_vert",	(162,200,161)),\
				(_(u"Gris colore bleu"),	"gris_colore_bleu",	(161,162,206)),\
				(_(u"Gris colore jaune"),	"gris_colore_jaune",	(200,200,162))]
		stacked_couleursPredef = FiltresAvecCombo(_(u"Type"), liste, 'couleurs_predefinies', self)
		liste = [	(_(u"Fond blanc, lignes noires"),	"fond_blanc_lignes_noires"),\
				(_(u"Fond noir, lignes blanches"),	"fond_noir_lignes_blanches")]
		stacked_evanescence = FiltresAvecCombo(_(u"Fond, forme"), liste, 'evanescence', self)
		liste = [	(_(u"Négatif couleur"),	"negatif_couleur"),\
				(_(u"Négatif noir et blanc"),	"negatif_n_et_b")]
		stacked_negatif = FiltresAvecCombo(_(u"Type de négatif"), liste, 'negatif', self)
		liste = [       (_(u"90 degrés vers la gauche"), 'rot_img_90_gauche'),\
				(_(u"180 degrés vers la gauche"), 'rot_img_180_gauche'),\
				(_(u"270 degrés vers la gauche"), 'rot_img_270_gauche')]
		stacked_retournement_img = FiltresAvecCombo(_(u"Type de rotation"), liste, 'rotation_image', self)
		liste = [       (_(u"Noir et blanc"), 'laplacien_1_noir_et_blanc'),\
				(_(u"Couleur"), 'laplacien_1_couleur')]
		stacked_laplacien_1 = FiltresAvecCombo(_(u"Type"), liste, 'laplacien_1', self)
 
 
		# Widgets du stacked avec un ou plusieurs combos et boite(s) de spin
		liste = [	(_(u"Noir"),		"noir"),\
				(_(u"Gris"),		"gris"),\
				(_(u"Blanc"),		"blanc"),\
				(_(u"Rouge"),	        "rouge"),\
				(_(u"Vert"),		"vert"),\
				(_(u"Bleu"),		"bleu"),\
				(_(u"Jaune"),		"jaune")]
		stacked_encadrePhoto = FiltresAvecCombo(_(u"Couleur du cadre"), liste, 'encadre_photo', self)
 
		# Widgets du stacked avec une seule boite de spin
		stacked_sepia = SpinSliders(self, 50,99,60,_(u"% de sepia"), 'sepia')
		stacked_traitsNoirs = SpinSliders(self, 1,70,1,_(u"valeur de charcoal"), 'charcoal_traits_noirs')
		stacked_peuCouleurs = SpinSliders(self, 30,90,40, _(u"valeur de edge"), 'edge')
		stacked_peintHuile = SpinSliders(self, 1,20,1, _(u"valeur de la peinture à l'huile"), 'peinture_huile')
		stacked_gamma = SpinSliders(self, 0,20,1, _(u"valeur de gamma"), 'gamma')
		stacked_fonceClair = SpinSliders(self, 1,400,100, _(u"1: Noir; 100: Normal; 400: Surexposé"), 'fonce_clair')
		stacked_peintEau = SpinSliders(self, 4,16,6, _(u"valeur de la liquidité"), 'liquidite')
		stacked_basRelief = SpinSliders(self, 1,16,1, _(u"Netteté du bas-relief"), 'bas_relief')
		# ----------------------------------------------------------------------
		# Géré par G'MIC
		stacked_dessin_13_coul = SpinSliders(self, 1,7000,1874, _(u"Amplitude"), 'dessin_13_amplitude')
		# ----------------------------------------------------------------------
		# Géré par G'MIC
		stacked_dessin_14_crayPapier_2 = SpinSliders(self, 1,50,3, _(u"Taille"), 'dessin_14_taille')
		# ----------------------------------------------------------------------
 
		# Widgets du stacked avec 2 boites de spin
		stacked_crayonPapier_1 = SpinSliders(self,
			1,70,1, _(u"valeur de charcoal"),'charcoal_crayon_1',
			1,10,1, _(u"valeur de spread"), 'spread_crayon_1')
		stacked_blur = SpinSliders(self,
			1,16,1, _(u"radius"), 'radius',
			1,16,1, _("sigma"), 'sigma')
		stacked_traitCoulFond = SpinSliders(self,
			1,20,1, _(u"précision du trait (1: Net; 20: Flou)"), 'precision_trait',
			1,20,1, _(u"largeur du trait (1 : Fin; 20 : Gras)"), 'largeur_trait')
		stacked_seuillage = SpinSliders(self,
			1,255,1, _(u"seuillage bas"), 'seuillage_bas',
			1,255,128, _(u"seuillage haut"), 'seuillage_haut')
		stacked_imitationBd_2 = SpinSliders(self,
			10,40,28, _(u"intensité du trait"), 'intensite_du_trait_bd_2',
			2,16,4, _(u"flou des couleurs"), 'flou_couleurs')
		# ----------------------------------------------------------------------
		# Géré par G'MIC
		########Rajout le 28/11/2010 par LUCAS Thomas et CABANA Antoine#########
		stacked_visionThermique = SpinSliders(self,
			1,255,1, _(u"Minimum de luminance"), 'vision_thermique_min',
			1,255,255, _(u"Maximum de luminance"), 'vision_thermique_max')
		########################################################################
		# ----------------------------------------------------------------------
 
		# Widgets du stacked avec 3 boites de spin
		stacked_imitationBd_1 = SpinSliders(self,
			10,40,28, _(u"intensité du trait"), 'intensite_du_trait_bd_1',
			1,4,2, _(u"réduction des couleurs"), 'reduction_couleur',
			1,8,6, _(u"contraste des couleurs"), 'contraste_couleur')
		# ----------------------------------------------------------------------
		# Géré par G'MIC
		stacked_cubismeAnalytique = SpinSliders(self, 
			1,1000,240, _(u"Itérations"), 'iterations_cubisme_analytique',
			1,100,8, _(u"Taille de bloc"), 'taille_bloc_cubisme_analytique',
			1,360,114, _(u"Angle"), 'angle_cubisme_analytique')
		# ----------------------------------------------------------------------
		# Géré par G'MIC
		stacked_correctionYeuxRouges = SpinSliders(self,
			1,100,80, _(u"Seuil des couleurs"), 'seuil_coul_correct_yeux_rouges',
			1,100,1, _(u"Lissage"), 'lissage_correct_yeux_rouges',
			1,100,1, _(u"Atténuation"), 'attenuation_correct_yeux_rouges')
		# ----------------------------------------------------------------------
		# Géré par G'MIC
		stacked_expressionnisme = SpinSliders(self,
			1,10,2, _(u"Abstraction"), 'abstraction_expressionnisme',
			1,500,180, _(u"Lissage"), 'lissage_expressionnisme',
			1,400,340, _(u"Couleur"), 'couleur_expressionnisme')
		# ----------------------------------------------------------------------
		# Géré par G'MIC
		stacked_vieille_photo = SpinSliders(self,
			1,10,4, _(u"Taille en largeur de l'ombre"), 'taill_larg_ombre_vieil_photo',
			1,10,4, _(u"Taille en hauteur de l'ombre"), 'taill_haut_ombre_vieil_photo',
			1,90,10, _(u"Rotation (en degrés) de la photo"), 'rot_photo_vieil_photo')
		# ----------------------------------------------------------------------
 
		# Widgets du stacked avec 20 boites de spin possibles (classe SpinSliders20Possibles de gui_modules_image.image_base)
		# ----------------------------------------------------------------------
		# Géré par G'MIC
		stacked_polaroid = SpinSliders20Possibles(self, 
			5,50,10, _(u"Taille de la bordure"), 'taill_bord_polaroid',
			1,10,4, _(u"Taille en largeur de l'ombre"), 'taill_larg_ombre_polaroid',
			1,10,4, _(u"Taille en hauteur de l'ombre"), 'taill_haut_ombre_polaroid',
			1,90,10, _(u"Rotation (en degrés) de la photo"), 'rot_photo_polaroid')
		# ----------------------------------------------------------------------
		# Géré par G'MIC
		stacked_oeilleton = SpinSliders20Possibles(self, 
			1,100,50, _(u"Position sur la largeur"), 'pos_larg_oeilleton',
			1,100,50, _(u"Position sur la hauteur"), 'pos_haut_oeilleton',
			1,100,50, _(u"Rayon"), 'rayon_oeilleton',
			1,10,1, _(u"Amplitude"), 'amplitude_oeilleton')
		# ----------------------------------------------------------------------
		# Géré par G'MIC
		stacked_andyWarhol = SpinSliders20Possibles(self, 
			1,20,3, _(u"Nombre d'images par ligne"), 'nbre_img_ligne_andy_warhol',
			1,20,3, _(u"Nombre d'images par colonne"), 'nbre_img_colonne_andy_warhol',
			1,10,1, _(u"Lissage"), 'lissage_andy_warhol',
			1,256,40, _(u"Couleur"), 'couleur_andy_warhol')
		# ----------------------------------------------------------------------
		# Géré par G'MIC
		stacked_bull_en_tableau = SpinSliders20Possibles(self, 
			100,2048,1024, _(u"Résolution en X"), 'resol_x_bull_en_tableau',
			100,2048,1024, _(u"Résolution en Y"), 'resol_y_bull_en_tableau',
			5,300,70, _(u"Rayon de la bulle"), 'rayon_bull_en_tableau',
			1,20,3, _(u"Bulles par ligne"), 'nbre_par_ligne_bull_en_tableau',
			1,20,3, _(u"Bulles par colonne"), 'nbre_par_ligne_bull_en_tableau',
			5,200,25, _(u"Largeur de la bordure"), 'larg_bordur_bull_en_tableau',
			5,200,25, _(u"Hauteur de la bordure"), 'haut_bordur_bull_en_tableau',
			100,3584,800, _(u"Largeur finale de l'image"), 'larg_final_img_bull_en_tableau',
			100,3584,800, _(u"Hauteur finale de l'image"), 'haut_final_img_bull_en_tableau')
		# ----------------------------------------------------------------------
		# Géré par G'MIC
		stacked_la_planete_1 = SpinSliders20Possibles(self, 
			1,6,2, _(u"Position des doubles"), 'pos_doubles_planete_1',
			10,1000,100, _(u"Rayon de la planète"), 'rayon_planete_1',
			1,500,60, _(u"Dilatation"), 'dilatation_planete_1',
			100,3584,800, _(u"Largeur finale de l'image"), 'larg_final_img_planete_1',
			100,3584,800, _(u"Hauteur finale de l'image"), 'haut_final_img_planete_1')
 
		########Rajout le 4/02/2011 par LUCAS Thomas et CABANA Antoine#########
		# ----------------------------------------------------------------------
		# Géré par G'MIC
		stacked_enflamme = SpinSliders20Possibles(self,
			1,8,4, _(u"Palette de couleur"), 'palette',
			1,4000,478, _(u"Amplitude du B&W sketch"), 'amplitude',
			100,1000,145, _(u"Echantillonnage"), 'sampling',
			1,1000,43, _(u"Lissage"), 'smoothness',
			1,100,2, _(u"Opacité"), 'opacity',
			1,100,15, _(u"Bord"), 'edge',
			1,1000,594, _(u"Amplitude de l'anisotropique smoothing"), 'amplitude1',
			1,200,83, _(u"Netteté"), 'sharpness',
			1,100,92, _(u"Anisotropie"), 'anisotropie',
			1,1000,50, _(u"Gradiant Smoothness"), 'gradiant',
			1,1000,360, _(u"Tensor Smoothness"), 'tensor',
			10,200,57, _(u"Precision spaciale"), 'spacial',
			1,180,33, _(u"Precision angulaire"), 'angle',
			10,500,200, _(u"Valeur de la Precision"), 'value',
			1,10,2, _(u"Iteration"), 'iteration')
		########################################################################
		########Rajout le 7/04/2011 par LUCAS Thomas et CABANA Antoine##########
		stacked_predator = FiltreAvecFileDialog(parent=self)
		############################################################
		# Widgets du stacked avec 9 boites de spins
		stacked_couleursPersonnal = FiltresAvec9Spin(parent=self)
 
		# Widgets du stacked avec 3 combos et 2 boites de spins ==> Non car pas réussi donc ...
		# _(u"Taille mini de la forme"), 'taille_mini_forme'
		# _(u"Taille maxi de la forme"), 'taille_maxi_forme'
		# Synonymes de modulation (ton, hauteur, fréquence...)
		stacked_separ_en_modules = SpinSliders(self,
			8,60,14, _(u"Taille mini de la forme"), 'taille_mini_forme',
			8,60,18, _(u"Taille maxi de la forme"), 'taille_maxi_forme')
 
		# Widgets du stacked avec 8 boites de spins
		stacked_ombrEtLumALaCouleur = FiltresAvec8Spin(parent=self)	
		stacked_contourEtCouleur = FiltresAvec13Spin(parent=self)
 
		#=== Ajout de widgets au stacked ===#
 
		# Widgets du stacked sans réglage
		indexStacked_sansReglage = self.stacked.addWidget(stacked_sansReglage)
 
		# Widgets du stacked avec un combo
		indexStacked_pointillisme = self.stacked.addWidget(stacked_pointillisme)
		indexStacked_couleursPredef = self.stacked.addWidget(stacked_couleursPredef)
		indexStacked_evanescence = self.stacked.addWidget(stacked_evanescence)
		indexStacked_negatif = self.stacked.addWidget(stacked_negatif)
		indexStacked_retournement_img = self.stacked.addWidget(stacked_retournement_img)
		indexStacked_laplacien_1 = self.stacked.addWidget(stacked_laplacien_1)
 
		# Widgets du stacked avec un/plusieurs combo(s) + boite(s) de spin
		indexStacked_encadrePhoto = self.stacked.addWidget(stacked_encadrePhoto)
 
		# Widgets du stacked avec une seule boite de spin
		indexStacked_sepia = self.stacked.addWidget(stacked_sepia)
		indexStacked_traitsNoirs = self.stacked.addWidget(stacked_traitsNoirs)
		indexStacked_peuCouleurs = self.stacked.addWidget(stacked_peuCouleurs)
		indexStacked_peintHuile = self.stacked.addWidget(stacked_peintHuile)
		indexStacked_gamma = self.stacked.addWidget(stacked_gamma)
		indexStacked_fonceClair = self.stacked.addWidget(stacked_fonceClair)
		indexStacked_peintEau = self.stacked.addWidget(stacked_peintEau )
		indexStacked_basRelief = self.stacked.addWidget(stacked_basRelief)
		# ----------------------------------------------------------------------
		# Géré par G'MIC
		indexStacked_dessin_13_coul = self.stacked.addWidget(stacked_dessin_13_coul)
		# ----------------------------------------------------------------------
		# Géré par G'MIC
		indexStacked_dessin_14_crayPapier_2 = self.stacked.addWidget(stacked_dessin_14_crayPapier_2)
		# ----------------------------------------------------------------------
 
		# Widgets du stacked avec 2 boites de spin
		indexStacked_crayonPapier_1 = self.stacked.addWidget(stacked_crayonPapier_1)
		indexStacked_blur = self.stacked.addWidget(stacked_blur)
		indexStacked_traitCoulFond = self.stacked.addWidget(stacked_traitCoulFond)
		indexStacked_seuillage = self.stacked.addWidget(stacked_seuillage)
		indexStacked_imitationBd_2 = self.stacked.addWidget(stacked_imitationBd_2)
		indexStacked_separ_en_modules = self.stacked.addWidget(stacked_separ_en_modules)
		# ----------------------------------------------------------------------
		# Géré par G'MIC
		indexStacked_correctYeuxRouges = self.stacked.addWidget(stacked_correctionYeuxRouges)
		# ----------------------------------------------------------------------
		# Géré par G'MIC
		########Rajout le 28/11/2010 par LUCAS Thomas et CABANA Antoine#################
		indexStacked_visionThermique = self.stacked.addWidget(stacked_visionThermique)
		################################################################################
 
		########Rajout le 7/04/2011 par LUCAS Thomas et CABANA Antoine##################
		indexStacked_predator = self.stacked.addWidget(stacked_predator)
		################################################################################
 
		# ----------------------------------------------------------------------
 
		# Widgets du stacked avec 3 boites de spin
		indexStacked_imitationBd_1 = self.stacked.addWidget(stacked_imitationBd_1)
		# ----------------------------------------------------------------------
		# Géré par G'MIC
		indexStacked_cubismeAnalytique = self.stacked.addWidget(stacked_cubismeAnalytique)
		# ----------------------------------------------------------------------
		# Géré par G'MIC
		indexStacked_expressionnisme = self.stacked.addWidget(stacked_expressionnisme)
		# ----------------------------------------------------------------------
		# Géré par G'MIC
		indexStacked_vieille_photo = self.stacked.addWidget(stacked_vieille_photo)
		# ----------------------------------------------------------------------
 
		# Widgets du stacked avec 20 boites de spin possibles (classe SpinSliders20Possibles de gui_modules_image.image_base)
		# ----------------------------------------------------------------------
		# Géré par G'MIC
		indexStacked_polaroid = self.stacked.addWidget(stacked_polaroid)
		# ----------------------------------------------------------------------
		# Géré par G'MIC
		indexStacked_oeilleton = self.stacked.addWidget(stacked_oeilleton)
		# ----------------------------------------------------------------------
		# Géré par G'MIC
		indexStacked_andyWarhol = self.stacked.addWidget(stacked_andyWarhol)
		# ----------------------------------------------------------------------
		# Géré par G'MIC
		indexStacked_bullEnTableau = self.stacked.addWidget(stacked_bull_en_tableau)
		# ----------------------------------------------------------------------
		# Géré par G'MIC
		indexStacked_laPlanete_1 = self.stacked.addWidget(stacked_la_planete_1)
		# ----------------------------------------------------------------------
 
		########Rajout le 4/02/2011 par LUCAS Thomas et CABANA Antoine#################
		indexStacked_enflamme = self.stacked.addWidget(stacked_enflamme)
		################################################################################
 
		# Widgets du stacked avec 9 boites de spins
		indexStacked_couleursPersonnal = self.stacked.addWidget(stacked_couleursPersonnal)
 
		# Widgets du stacked avec 8 boites de spins
		indexStacked_ombrEtLumALaCouleur = self.stacked.addWidget(stacked_ombrEtLumALaCouleur)
 
		# Widgets du stacked avec 13 boites de spins
		indexStacked_contourEtCouleur = self.stacked.addWidget(stacked_contourEtCouleur)
 
		# Boîte de combo
		self.comboReglage=QComboBox()
		# Paramètres de la liste de combo: [(nom entrée, identifiant, index du stacked,
		# instance stacked),...]
		self.listeComboReglage=[\
		(_(u'Vieux Films (bandes + poussières)'),	'vieux_films',		indexStacked_sansReglage,\
				stacked_sansReglage),\
		(_(u'Sepia'),					'sepia',		indexStacked_sepia,\
				stacked_sepia),\
		(_(u'Dessin 1: traits noirs'),			'traits_noirs',		indexStacked_traitsNoirs,\
				stacked_traitsNoirs),\
		(_(u'Dessin 2: crayon à papier 1'),		'crayon_papier_1',	indexStacked_crayonPapier_1,\
				stacked_crayonPapier_1),\
		(_(u'Dessin 3: monochrome'),			'monochrome',		indexStacked_sansReglage,\
				stacked_sansReglage),\
		(_(u'Dessin 4: avec un peu de couleur'),	'peu_couleur',		indexStacked_peuCouleurs,\
				stacked_peuCouleurs),\
		(_(u"Peinture à l'Huile"),			'peinture_huile',	indexStacked_peintHuile,\
				stacked_peintHuile),\
		(_(u'Blur - Floutage'),				'floutage',		indexStacked_blur,\
				stacked_blur),\
		(_(u'Gamma'),					'gamma',		indexStacked_gamma,\
				stacked_gamma),\
		(_(u'Dessin 5: traits de couleurs + fond noir'),'trait_couleur_fond_noir',indexStacked_traitCoulFond,\
				stacked_traitCoulFond),\
		(_(u'Pointillisme'),				'pointillisme',		indexStacked_pointillisme,\
				stacked_pointillisme),\
		(_(u'Foncé-Clair'),				'fonce_clair',		indexStacked_fonceClair,\
				stacked_fonceClair),\
		(_(u"Peinture à l'eau"),			'peinture_eau',		indexStacked_peintEau,\
				stacked_peintEau),\
		(_(u'Dessin 6: illustration en niveaux de gris'),'illustration_niveau_gris',indexStacked_sansReglage,\
				stacked_sansReglage),\
		(_(u'Dessin 7: traits très fins + couleur'),	'traits_fins&couleur',	indexStacked_sansReglage,\
				stacked_sansReglage),\
		(_(u'Emboss'),					'emboss',		indexStacked_sansReglage,\
				stacked_sansReglage),\
		(_(u'Sharpen (détails)'),			'sharpen',		indexStacked_sansReglage,\
				stacked_sansReglage),\
		(_(u'Niveaux de Gris'),				'niveau_gris',		indexStacked_sansReglage,\
				stacked_sansReglage),\
		(_(u'Couleurs prédéfinies'),			'couleurs_predefinies',	indexStacked_couleursPredef,\
				stacked_couleursPredef),\
		(_(u'Création de couleurs personnalisées'),	'couleurs_personnalisees',indexStacked_couleursPersonnal,\
				stacked_couleursPersonnal),\
		(_(u'Bas-relief ou pierre sculptée'),		'bas_relief',		indexStacked_basRelief,\
				stacked_basRelief),\
		(_(u'Amélioration des bords (image plus nette)'),'amelior_des_bords',	indexStacked_sansReglage,\
				stacked_sansReglage),\
		(_(u'Réduction du bruit (débruitage)'),		'debruitage',		indexStacked_sansReglage,\
				stacked_sansReglage),\
		(_(u'Dessin 8: seuillage des images'),		'seuillage',		indexStacked_seuillage,\
				stacked_seuillage),\
		(_(u'Dessin 9: evanescence'),			'evanescence',		indexStacked_evanescence,\
				stacked_evanescence),\
		(_(u'Dessin 10: imitation bande dessinée 1'),	'imitation_bd_1',	indexStacked_imitationBd_1,\
				stacked_imitationBd_1),\
		(_(u'Négatif (inverse les couleurs/valeurs)'),	'negatif',		indexStacked_negatif,\
				stacked_negatif),\
		(_(u'Encadrement photographique'),		'encadre_photo',	indexStacked_encadrePhoto,\
				stacked_encadrePhoto),\
		(_(u'Séparation en modules'),			'separ_en_modules',	indexStacked_separ_en_modules,\
				stacked_separ_en_modules),\
		(_(u'Ombre et lumière à la couleur'),		'omb_lum_a_la_coul',	indexStacked_ombrEtLumALaCouleur,\
				stacked_ombrEtLumALaCouleur),\
		(_(u'Rotation image'),		                'rotation_image',	indexStacked_retournement_img,\
				stacked_retournement_img),\
		(_(u'Dessin 11: imitation bande dessinée 2'),	'imitation_bd_2',	indexStacked_imitationBd_2,\
				stacked_imitationBd_2),\
		(_(u'Dessin 12: laplacien'),	                'laplacien_1',	        indexStacked_laplacien_1,\
				stacked_laplacien_1),\
		(_(u'Contour et couleur'),		        'contour_et_couleur',	indexStacked_contourEtCouleur,\
				stacked_contourEtCouleur),\
		(_(u'Dessin 13: en couleur'),		        'dessin_13_couleur',	indexStacked_dessin_13_coul,\
				stacked_dessin_13_coul),\
		(_(u'Dessin 14: crayon à papier 2'),		'crayon_papier_2',	indexStacked_dessin_14_crayPapier_2,\
				stacked_dessin_14_crayPapier_2),\
		(_(u'Atténuation des yeux rouges'),		'correct_yeux_rouges',	indexStacked_correctYeuxRouges,\
				stacked_correctionYeuxRouges),\
		(_(u'Solarisation'),	                        'solarisation',		indexStacked_sansReglage,\
				stacked_sansReglage),\
		(_(u'Oeilleton'),		                'oeilleton',	        indexStacked_oeilleton,\
				stacked_oeilleton),\
		(_(u'Polaroïd'),		                'polaroid',	        indexStacked_polaroid,\
				stacked_polaroid),\
		(_(u'Vieille photo'),		                'vieille_photo',	indexStacked_vieille_photo,\
				stacked_vieille_photo),\
		(_(u'Cubisme analytique'),		        'cubisme_analytique',	indexStacked_cubismeAnalytique,\
				stacked_cubismeAnalytique),\
		(_(u'Andy Warhol'),		                'andy_warhol',	        indexStacked_andyWarhol,\
				stacked_andyWarhol),\
		(_(u'Expressionnisme'),		                'expressionnisme',	indexStacked_expressionnisme,\
				stacked_expressionnisme),\
		(_(u'Bulles en tableau'),	                'bull_en_tableau',      indexStacked_bullEnTableau,\
				stacked_bull_en_tableau),\
		(_(u'La planète 1'),	                        'la_planete_1',         indexStacked_laPlanete_1,\
				stacked_la_planete_1),\
		(_(u'Vision thermique'),	                'vision_thermique',	indexStacked_visionThermique,\
				stacked_visionThermique),\
		########Rajout le 4/02/2011 par LUCAS Thomas et CABANA Antoine########################################
		(_(u'Enflamme'),	                'enflamme',	indexStacked_enflamme,\
				stacked_enflamme),\
		#######################################################################################################
		########Rajout le 7/04/2011 par LUCAS Thomas et CABANA Antoine###################################	
		(_(u'Predator'),			'predator',		indexStacked_predator,\
				stacked_predator)]
		#######################################################################################################
		###########################
		# Conversion en CMYK retiré le 30/11/08
		# (_(u'Conversion en CMYK'),			'cmyk',			indexStacked_sansReglage,\
		#	stacked_sansReglage),\
		###########################
 
		# Insertion des codecs de compression dans la boite de combo
		for i in self.listeComboReglage:
			self.comboReglage.addItem(QIcon("Icones" + os.sep + "Exemples" + os.sep +  str(i[1]) + ".jpg"), i[0], QVariant(i[1]))
 
		self.comboReglage.setIconSize(QSize(48, 36))
		self.connect(self.comboReglage, SIGNAL("currentIndexChanged(int)"), self.changerComboReglage)
		# Affiche l'entrée de la boite de combo inscrite dans un fichier de configuration
		self.base.valeurComboIni(self.comboReglage, self.config, self.idSection, 'filtre')
 
		# Gestion du nombre d'images à traiter
		# Se trouve maintenant directement dans l'onglet Réglages
		self.grid = QGridLayout()
		self.grid.addWidget(QLabel(_(u"Traitement à partir de l'image (numéro)")), 0, 0)
		self.spin1valNombres=SpinSlider(1, 100000, 1, '', self)
		self.grid.addWidget(self.spin1valNombres, 0, 1)
		self.connect(self.spin1valNombres, SIGNAL("valueChanged(int)"), self.changeValNbreImg_1)
		self.grid.addWidget(QLabel(_(u"Nombre de chiffres après le nom de l'image")), 1, 0)
		self.spin2valNombres=SpinSlider(3, 18, 6, '', self)
		self.grid.addWidget(self.spin2valNombres, 1, 1)
		self.connect(self.spin2valNombres, SIGNAL("valueChanged(int)"), self.changeValNbreImg_1)
 
		self.grid.setAlignment(Qt.AlignHCenter)
		vboxReglage.addLayout(self.grid)
		vboxReglage.addStretch()
 
		hbox = QHBoxLayout()
		hbox.addWidget(QLabel(_(u'Type')))
		hbox.addWidget(self.comboReglage)
		hbox.setAlignment(Qt.AlignHCenter)
 
                self.scroll = QScrollArea()
                self.scroll.setWidget(self.stacked)
 
		vboxReglage.addLayout(hbox)
		vboxReglage.addWidget(self.scroll)
		#vboxReglage.addWidget(self.stacked)
		vboxReglage.addStretch()
 
		#----------------
		# Onglet de log
		#----------------
 
		self.zoneAffichInfosImg = QTextEdit("")
		if PYQT_VERSION_STR < "4.1.0":
			self.zoneAffichInfosImg.setText = self.zoneAffichInfosImg.setPlainText
		self.zoneAffichInfosImg.setReadOnly(True)
		self.framInfos=QFrame()
		vboxInfIm=QVBoxLayout(self.framInfos)
		vboxInfIm.addWidget(self.zoneAffichInfosImg)
 
		# -------------------------------------------------
		# Onglets d'affichage image source et destination
		# -------------------------------------------------
 
		# Là où s'afficheront les images
		self.afficheurImgSource=SelectWidget(mode="icone", geometrie = self.mainWindowFrameGeometry)
		self.afficheurImgDestination=Lecture_VisionImage(statusBar)
 
		# Curseur de parcours des images source ou destination
		# Déclaré ici à cause d'un bogue pas très logique sous MAC (bilbon)
		#self.curseur = QSlider(Qt.Horizontal)
		#self.curseur.setEnabled(False)
 
		vbox.addWidget(self.tabwidget)
 
		self.indexTabImgSource = self.tabwidget.addTab(self.afficheurImgSource, _(u'Image(s) source'))
		self.indexTabImgReglage = self.tabwidget.addTab(self.framReglage, _(u'Réglages'))
		self.indexTabImgDestin = self.tabwidget.addTab(self.afficheurImgDestination, _(u'Images après traitement'))
		self.indexTabImgInfos = self.tabwidget.addTab(self.framInfos, _(u'Infos'))
 
		# -------------------------------------------
		# widgets du bas : curseur + ligne + boutons
		# -------------------------------------------
 
		# Boutons
		self.boutAide=QPushButton(_(u" Aide"))
		self.boutAide.setIcon(QIcon("Icones" + os.sep + "icone_aide_128.png"))
		self.connect(self.boutAide, SIGNAL("clicked()"), self.afficherAide)
		self.boutApPremImg = QPushButton(_(u" Voir le résultat"))
		self.boutApPremImg.setIcon(QIcon("Icones" + os.sep + "icone_visionner_128.png"))
		self.boutApPremImg.setFocusPolicy(Qt.NoFocus)
		self.boutApPremImg.setEnabled(False)
		self.connect(self.boutApPremImg, SIGNAL("clicked()"), self.visu_1ere_img)
		self.boutAppliquer=QPushButton(_(u" Appliquer et sauver"))
		self.boutAppliquer.setIcon(QIcon("Icones" + os.sep + "icone_appliquer_128.png"))
		self.boutAppliquer.setEnabled(False)
 
		self.connect(self.boutAppliquer, SIGNAL("clicked()"), self.appliquer0)
 
		# Ligne de séparation juste au dessus des boutons
		ligne = QFrame()
		ligne.setFrameShape(QFrame.HLine)
		ligne.setFrameShadow(QFrame.Sunken)
		vbox.addWidget(ligne)
		vbox.addSpacing(-5)	# la ligne doit être plus près des boutons
 
		hbox=QHBoxLayout()
		hbox.addWidget(self.boutAide)
		hbox.addStretch()
		hbox.addWidget(self.boutApPremImg)
		hbox.addStretch()
		hbox.addWidget(self.boutAppliquer)
		vbox.addLayout(hbox)
 
		#-----------------------------
		# Barre de progression
		#-----------------------------
 
		self.progress=QProgressDialog(_(u"Filtrage en cours..."), _(u"Arrêter"), 0, 100)
		self.progress.setWindowTitle(_(u'EnKoDeur-Mixeur. Fenêtre de progression'))
		self.progress.setMinimumWidth(500)
		self.progress.setMinimumHeight(100)
		self.connect(self.progress, SIGNAL("canceled()"), self.arretProgression)
 
 
		# affichage de la boîte principale
		self.setLayout(vbox)
 
		self.connect(self.tabwidget, SIGNAL("currentChanged(int)"), self.fctTab)
 
		#----------------------------------------------------------------------------------------------------
		# Signal de présence d'images dans ler widget de sélection -> modifie le statut des boutons d'action
		#----------------------------------------------------------------------------------------------------
 
		self.connect(self.afficheurImgSource, SIGNAL("pictureChanged(int)"), self.modifBoutonsAction)
 
 
	def modifBoutonsAction(self, i):
		"On active ou désactive les boutons d'action selon s'il y a des images ou pas dans le widget de sélection"
		self.boutAppliquer.setEnabled(i)
		self.boutApPremImg.setEnabled(i)
		self.modifImageSource = 1
 
 
	def changerComboReglage(self, i):
		"""L'entrée sélectionnée de la boîte de combo modifie le QFrame de réglage du codec associée"""
		self.stacked.setCurrentIndex(self.listeComboReglage[i][2])
		self.config.set(self.idSection, 'filtre',self.listeComboReglage[i][1])
 
 
	def changeValNbreImg_1(self):
		"""gestion du nombre d'images à traiter"""
		print "Traitement a partir de l'image (numero):", self.spin1valNombres.value()
		print "Nombre de chiffres apres le nom de l'image:", self.spin2valNombres.value()
 
 
	def fctTab(self, i):
		"Affichage d'une ou plusieurs images converties"
 
		# Cela ne concerne que l'onglet de visualisation des images après leur conversion
		if i == self.indexTabImgDestin:
			if self.conversionImg:
				# Affichage si on sauvegarde par le bouton Appliquer et sauver
				print "La conversion vient d'avoir lieu -> affichage des images du lot de destination"
				cheminImages = os.path.dirname(self.listeImgDestin[0])
				liste = []
				for fichier in self.listeImgDestin:
					liste.append(os.path.basename(fichier))
				self.afficheurImgDestination.updateImages(liste, cheminImages)
			elif not self.boutAppliquer.isEnabled() or self.modifImageSource:
				# Si le bouton de conversion n'est pas actif, c'est qu'il n'y a plus d'image source
				# -> on n'a plus de raison de maintenir des images dans l'afficheur de résultat
				# Si les images sources ont été modifiées, on purge aussi l'afficheur de résultat
				self.afficheurImgDestination.updateImages([])
			self.conversionImg = 0
			self.modifImageSource = 0
 
 
	def metaFctTab(self, i):
		"""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"""
		if self.tabwidget.currentIndex()!=i:
			self.tabwidget.setCurrentIndex(i)
		else: self.fctTab(i)
 
 
	def logFinal(self, titreFiltre):
		"""Affichage des informations de conversion"""
		a='#'*36
		# On ne récupère pas l'ancien % car il est arrondi
		pourCent=round(float(len(self.listeImgDestin))/len(self.listeImgSource)*100)
		pourCent = "%.0f" %pourCent
		b = a + '\n# ' + _(u'Filtre utilisé: ') + titreFiltre + '\n' + a + '\n'
		c = _(u"nombre d'images converties / nombre d'images sources")+" = "+str(len(self.listeImgDestin))+" / "\
		+str(len(self.listeImgSource))+" = " + pourCent +" %\n\n"
 
		# Le dernier '\n' est parfois nécessaire pour voir la dernière ligne!
		self.zoneAffichInfosImg.setText(b+c+self.infosImgTitre[0]+\
		"\n".join(self.listeImgSource)+'\n\n'+self.infosImgTitre[1]+"\n".join(self.listeImgDestin)+'\n')
 
 
	def stat_dim_img(self):
		"""Calcul statistique des dimensions des images les plus présentes dans le lot"""
 
		# Ouverture et mise ds une liste des dimensions des images
		listePrepaRedim=[Image.open(aA).size for aA in self.listeImgSource]
 
		# Merci beaucoup à Marc Keller de la liste: python at aful.org de m'avoir
		# aidé pour cette partie (les 4 lignes en dessous)
		dictSeq={}.fromkeys(listePrepaRedim, 0)
		for cle in listePrepaRedim: dictSeq[cle]+=1
		self.lStatDimSeq=sorted(zip(dictSeq.itervalues(), dictSeq.iterkeys()), reverse=1)
		self.dimStatImg=self.lStatDimSeq[0][1]
 
		print "Toutes les dimensions des images (avec le nbre d'images):", self.lStatDimSeq
		print 'Dimension des images la plus presente dans la sequence:', self.dimStatImg
		print "Nombre de tailles d'images différentes dans le lot :", len(self.lStatDimSeq)
 
		if len(self.lStatDimSeq)>1: return 0
		else: return 1
 
 
	def redim_img(self):
		"""Si l'utilisateur charge des images avec des tailles complètement différentes --> les images de la séquence  peuvent être redimensionnées"""
 
		if not self.stat_dim_img():
			reply = QMessageBox.warning(self, 'Message',
			_(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)
			if reply == QMessageBox.No:
				return
 
			# Les images de tailles différentes à la plus répandue sont redimensionnées
			# dans un répertoire temporaire.
			# Les images redimensionnées voient leur chemin modifié dans la liste des
			# chemins des images sources. Les autres chemins ne changent pas.
			index=0
			for chemImg in self.listeImgSource:
				obImg=Image.open(chemImg)
				if obImg.size!=self.dimStatImg:
					pass
				sRedim=obImg.resize(self.dimStatImg, Image.ANTIALIAS)
				chemSortie = self.repTampon+'redim'+os.sep+os.path.basename(chemImg)
				sRedim.save(chemSortie)
				self.listeImgSource[index] = chemSortie
				index += 1
 
 
	def appliquerCouleursPredef(self):
		"""Conversion des images pour le filtre: Couleurs Prédéfinies"""
		indexCombo = self.listeComboReglage[self.i][3].combo.currentIndex()
		entreeCombo = str(self.listeComboReglage[self.i][3].combo.itemData(indexCombo).toStringList()[0])
 
		if entreeCombo=="rouge_vif":
			couleur_Img_Predef=(
			1.0, 0.3, 0.0, 0,
			0.0, 0.0, 0.0, 0,
			0.0, 0.0, 0.0, 0)
		elif entreeCombo=="rouge_primaire":
			couleur_Img_Predef=(
			1.0, 0.3, 0.0, 0,
			0.0, 0.0, 0.0, 0,
			0.7, 0.0, 0.0, 0)
		elif entreeCombo=="vert_perroquet":
			couleur_Img_Predef=(
			0.0, 0.0, 0.0, 0,
			1.0, 0.3, 0.0, 0,
			0.0, 0.0, 0.0, 0)
		elif entreeCombo=="vert_acide_clair":
			couleur_Img_Predef=(
			1.0, 0.0, 0.0, 0,
			1.0, 0.3, 0.0, 0,
			0.0, 0.0, 0.0, 0)
		elif entreeCombo=="bleu_roi":
			couleur_Img_Predef=(
			0.0, 0.0, 0.0, 0,
			1.0, 0.0, 0.0, 0,
			1.0, 1.0, 0.0, 0)
		elif entreeCombo=="bleu_indigo":
			couleur_Img_Predef=(
			1.0, 0.0, 0.0, 0,
			1.0, 0.0, 0.0, 0,
			1.0, 1.0, 0.0, 0)
		elif entreeCombo=="bleu_turquoise":
			couleur_Img_Predef=(
			1.0, 0.0, 0.0, 0,
			1.0, 1.0, 0.0, 0,
			1.0, 1.0, 0.0, 0)
		elif entreeCombo=="jaune_or":
			couleur_Img_Predef=(
			0.64, 0.64, 0.10, 0,
			0.56, 0.56, 0.10, 0,
			0.0, 0.0, 0.0, 0)
		elif entreeCombo=="jaune_orange":
			couleur_Img_Predef=(
			1.0, 0.5, 0.5, 0,
			1.0, 0.3, 0.0, 0,
			0.0, 0.0, 0.0, 0)
		elif entreeCombo=="saumon":
			couleur_Img_Predef=(
			1.0, 0.5, 0.0, 0,
			1.0, 0.1, 0.0, 0,
			1.0, 0.0, 0.0, 0)
		elif entreeCombo=="marron_tres_clair":
			couleur_Img_Predef=(
			0.95, 0.38, 0.0, 0,
			0.90, 0.15, 0.0, 0,
			0.48, 0.26, 0.0, 0)
		elif entreeCombo=="terre argileuse":
			couleur_Img_Predef=(
			0.96, 0.58, 0.0, 0,
			0.56, 0.44, 0.0, 0,
			0.46, 0.32, 0.0, 0)
		elif entreeCombo=="gris_colore_rouge":
			couleur_Img_Predef=(
			0.68, 0.68, 0.0, 0,
			0.50, 0.50, 0.0, 0,
			0.50, 0.50, 0.0, 0)
		elif entreeCombo=="gris_colore_vert":
			couleur_Img_Predef=(
			0.50, 0.50, 0.0, 0,
			0.62, 0.62, 0.0, 0,
			0.50, 0.50, 0.0, 0)
		elif entreeCombo=="gris_colore_bleu":
			couleur_Img_Predef=(
			0.50, 0.50, 0.0, 0,
			0.50, 0.50, 0.0, 0,
			0.64, 0.64, 0.0, 0)
		elif entreeCombo=="gris_colore_jaune":
			couleur_Img_Predef=(
			0.62, 0.62, 0.0, 0,
			0.62, 0.62, 0.0, 0,
			0.50, 0.50, 0.0, 0)
 
		for self.j in self.listeIndex:
			# Sauvegarde
			self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
			obImg = Image.open(self.listeImgSource[self.j])
			convert = obImg.convert("RGB").convert("RGB", couleur_Img_Predef)
			convert.save(self.cheminCourantSauv)
			if not self.opReccurApresApp(): return
 
 
	def appliquerVieuxFilms(self):
		"""Conversion des images pour le filtre: Vieux Films"""
		listePous=[
		'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',
		'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',
		'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',
		'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',
		'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',
		'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',
		'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',
		'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',
		'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',
		'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',
		'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',
		'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',
		'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']
 
		for self.j in self.listeIndex:
 
			process = QProcess(self)
 
			# Uniquement pour Linux et MacOSX
			if os.name in ['posix', 'mac']:
 
				process.start("convert -blur 1%x1% -fx intensity ""\""+self.listeImgSource[self.j]+"\" "+self.repTampon+"vf_vieux_films1")
				if not process.waitForStarted(3000):
					QMessageBox.warning(None, _(u"Erreur"), _(u"Bogue au lancement de la commande"))
				process.waitForFinished(-1)
 
			# Uniquement pour windows
			elif os.name == 'nt':
 
				# Attention ici dans la version windows ce n'est pas traité par un 
				# QProcess (comme sous Linux) mais directement avec os.system (car le
				# QProcess avec la commande convert d'ImageMagick génère une erreur)
				os.system("convert -blur 1%x1% -fx intensity "+"\""+self.listeImgSource[self.j]+"\""+' '+"\""+self.repTampon+"vf_vieux_films1"+"\"")
 
			img0=Image.open(self.listeImgSource[self.j])
			taille=img0.size
 
			# Uniquement pour Linux et MacOSX
			if os.name in ['posix', 'mac']:
 
				process.start("convert "+listePous[randrange(len(listePous))]+" -resize "+ str(taille[0])+'x'+str(taille[1])+"! "+self.repTampon+"vf_vieux_films2")
				if not process.waitForStarted(3000):
					QMessageBox.warning(None, _(u"Erreur"), _(u"Bogue au lancement de la commande"))
				process.waitForFinished(-1)
 
			# Uniquement pour windows
			elif os.name == 'nt':
 
				# Attention ici dans la version windows ce n'est pas traité par un 
				# QProcess (comme sous Linux) mais directement avec os.system (car le
				# QProcess avec la commande convert d'ImageMagick génère une erreur)
				os.system("convert "+"\""+listePous[randrange(len(listePous))]+"\""+" -resize "+ str(taille[0])+'x'+str(taille[1])+"! "+"\""+self.repTampon+"vf_vieux_films2"+"\"")
 
			img1 = Image.open(self.repTampon+"vf_vieux_films2")
			img2 = Image.open(self.repTampon+"vf_vieux_films1")
			compos = Image.composite(img1,img2,img1)
 
			# Sauvegarde
			self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
			compos.save(self.cheminCourantSauv)
 
			if not self.opReccurApresApp(): return
			self.j += 1
 
 
	def appliquerSeuillage(self):
		""" Dessin 8: seuillage (avec intégration de syntaxe Numpy) """
		for self.j in self.listeIndex:
			# Ouverture des images
			obImg = Image.open(self.listeImgSource[self.j])
			# Récup réglages de seuillage bas et seuillage haut
			spin1 = self.listeComboReglage[self.i][3].spin1.value() # seuil bas
			spin2 = self.listeComboReglage[self.i][3].spin2.value() # seuil haut
			# La valeur de seuil bas ne doit jamais être supérieure ou égale à la valeur de
			# seuil haut (produirait des images sans interêt) --> dans ce cas le processus
			# s'arrête et un message avertit l'utilisateur.
			if spin1>=spin2:
				erreur=QMessageBox(self)
				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."))
				erreur.setWindowTitle(_(u"Erreur de réglage"))
				erreur.setIcon(QMessageBox.Warning)
				erreur.exec_()
				break
			else: pass
			# Conversion et sauvegarde en niveaux de gris
			imageNDG = obImg.convert("L")
			# Recup dimensions de l'image
			wSeuil, hSeuil = imageNDG.size
			# Filtre egalisateur pour renforcer les zones claires et les zones foncées
			egaliseNDG_Seuil = ImageOps.equalize(imageNDG)
			# Creation d'une nouvelle image
			nouvImgNDG_Seuil = Image.new("L", (wSeuil, hSeuil))
			# Insertion data ds nouvImgNDG_Seuil
			nouvImgNDG_Seuil.putdata(egaliseNDG_Seuil.getdata())
			# Récup des données contenues ds l'image et mises dans un tableau par Numpy
			dataNDG_Seuil=array(nouvImgNDG_Seuil)
			# Aplatissement du tableau pour traitement
			aplatNDG_Seuil=dataNDG_Seuil.flat
			# Condition: (apres parcours de chaque element du tableau)
			# ==> correspond en python classique a :
			# if aplatNDG_Seuil>=spin1 and aplatNDG_Seuil<=spin2:
			# Les pixels blancs seront placés ici.
			condSeuil=(aplatNDG_Seuil>=spin1)&(aplatNDG_Seuil<=spin2)
			# Selon la condition, remplacement de chaque element/pixel
			# soit par 0 --> noir, soit par 255 --> blanc .
			idSeuil=where(condSeuil, 0, 255)
			# Creation d'une nouvelle image
			nouvImgBinaire=Image.new("L", (wSeuil, hSeuil))
			# Insertion data ds nouvImgBinaire et conversion en liste classique
			nouvImgBinaire.putdata(idSeuil.tolist())
			# Sauvegarde
			self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
			nouvImgBinaire.save(self.cheminCourantSauv)
			# Fin
			if not self.opReccurApresApp(): return
			self.j += 1
 
 
	def appliquerEvanescence(self):
		""" Dessin 9: traits noirs, fond blanc (avec intégration de syntaxe Numpy) """
		for self.j in self.listeIndex:
			# Récupération de l'index et l'entrée du combo de sélection
			indexCombo = self.listeComboReglage[self.i][3].combo.currentIndex()
			entreeCombo = str(self.listeComboReglage[self.i][3].combo.itemData(indexCombo).toStringList()[0])
			# Ouverture des images. Conversion et sauvegarde en niveaux de gris
			obImg = Image.open(self.listeImgSource[self.j]).convert("L")
			# Recup dimensions de l'image
			w, h = obImg.size
			# Kernel 5x5 Réduction du Bruit
			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)))
			imKernel.save(self.repTampon+'_tmp_g546gf546ezr53ww7i.png', 'PNG')
			# Ouverture de l'image temporaire
			ouvImg = Image.open(self.repTampon+'_tmp_g546gf546ezr53ww7i.png')
			# Filtre egalisateur pour renforcer les zones claires et les zones foncées
			egalise = ImageOps.equalize(ouvImg)
			# Creation d'une nouvelle image
			nouvImg = Image.new("L", (w, h))
			# Insertion data ds nouvImg
			nouvImg.putdata(egalise.getdata())
			# Récup des données contenues ds l'image et mises dans un tableau par Numpy
			data = array(nouvImg)
			# Aplatissement du tableau pour traitement
			aplat = data.flat
			# Condition: (apres parcours de chaque element du tableau)
			condition=(aplat>=1)&(aplat<=255)
			# Selon la condition, remplacement de chaque element/pixel
			# soit par 255 --> blanc, soit par 0 --> noir
			if entreeCombo=='fond_blanc_lignes_noires': idCond = where(condition, 255, 0)
			elif entreeCombo=='fond_noir_lignes_blanches': idCond = where(condition, 0, 255)
			# Creation d'une nouvelle image
			nouvImgBinaire=Image.new("L", (w, h))
			# Insertion data ds nouvImgBinaire et conversion en liste classique
			nouvImgBinaire.putdata(idCond.tolist())
			# Sauvegarde
			self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext ##
			nouvImgBinaire.save(self.cheminCourantSauv)
			# Fin
			if not self.opReccurApresApp(): return
			self.j += 1
			# Purge du répertoire tampon
			os.remove(self.repTampon+'_tmp_g546gf546ezr53ww7i.png')
 
 
	def appliquerImitationBd_1(self):
		""" Dessin 10: imitation bande dessinée (avec intégration [un peu] de syntaxe Numpy) """
		for self.j in self.listeIndex:
		# Récup réglages ci-dessous
			spin1 = self.listeComboReglage[self.i][3].spin1.value() # intensité des traits
			spin2 = self.listeComboReglage[self.i][3].spin2.value() # réduction des couleurs
			spin3 = self.listeComboReglage[self.i][3].spin3.value() # contraste de couleurs
			# Ouverture des images. Conversion et sauvegarde en niveaux de gris
			obImg = Image.open(self.listeImgSource[self.j]).convert("L")
			# Recup dimensions de l'image
			w, h = obImg.size
 
			# Partie 1 ------ Détection du contour des formes et traçage des futurs traits noirs ----
			# Kernel 5x5 Réduction du Bruit + ajout de la valeur de spin1 au centre de la matrice
			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)))
			imKernel.save(self.repTampon+'tmp_gds568ec4u5hg53g7s9m4rt.png', 'PNG')
			# Ouverture de l'image temporaire
			ouvImg = Image.open(self.repTampon+'tmp_gds568ec4u5hg53g7s9m4rt.png')
			# Filtre egalisateur pour renforcer les zones claires et les zones foncées
			egalise = ImageOps.equalize(ouvImg)
			# Creation d'une nouvelle image
			nouvImg = Image.new("L", (w, h))
			# Insertion data ds nouvImg
			nouvImg.putdata(egalise.getdata())
			# Récup des données contenues ds l'image et mises dans un tableau par Numpy
			data = array(nouvImg)
			# Aplatissement du tableau pour traitement
			aplat = data.flat
			# Condition: (apres parcours de chaque element du tableau)
			condition = (aplat>=1)&(aplat<=255)
			# Selon la condition, remplacement de chaque element/pixel
			# soit par 255 --> blanc, soit par 0 --> noir
			idCond = where(condition, 255, 0)
			# Creation d'une nouvelle image
			nouvImgBinaire = Image.new("L", (w, h))
			# Insertion data ds nouvImgBinaire et conversion en liste classique
			nouvImgBinaire.putdata(idCond.tolist())
			# Recup des donnees
			listeAlpha_1=list(nouvImgBinaire.getdata())
			# Creation de la liste newListRGBAbin
			newListRGBAbin=[]
			for parcListe in listeAlpha_1:
				# Si on a des pixels blancs et transparents dans listeAlpha_1 alors on injecte
				# des pixels blancs transparents mais ce  coup-ci en mode RGBA .
				if parcListe==255: newListRGBAbin.append((255, 255, 255, 0))
				# (Autre) si on a des pixels noirs et opaques dans listeAlpha_1
				# alors on injecte des pixels noirs opaques mais ce coup-ci en
				# mode RGBA .
				else: newListRGBAbin.append((0, 0, 0, 255))
 
			# Creation d'une nouvelle image
			nouvImgRGBA=Image.new("RGBA", (w, h))
			# Insertion data ds nouvImgRGBA
			nouvImgRGBA.putdata(newListRGBAbin)
			# Sauvegarde image temporaire
			nouvImgRGBA.save(self.repTampon+'tmp_gds568ec4u5hg53g7s9m4rt.png', 'PNG')
			# Attention il faut diviser par 10.0 la valeur de spin3 (c'est à dire contraste
			# de couleurs). On divise par 10.0 et pas 10 !.
			spin3=float(spin3/10.0)
 
			# Partie 2 ------ Réduction/postérisation/contraste des couleurs du fond de l'image -----
			# Ouverture de l'image principale dans le lot
			imPrinc=Image.open(self.listeImgSource[self.j])
			# Application du filtre pour la reduction des couleurs
			imPosterize=ImageOps.posterize(imPrinc, spin2)
			# Conversion en RGBA pour pouvoir compositer ...
			imPosterize.convert('RGBA')
			imPosterize.save(self.repTampon+'tmp_gds89gfdt39xfg6d9qxx1f.png', 'PNG')
			# Ouverture de l'image posterizee pour poursuite du traitement (application contraste)
			imPostTraitC=Image.open(self.repTampon+'tmp_gds89gfdt39xfg6d9qxx1f.png')
			# Application du filtre contraste et sauvegarde du fichier temporaire
			imContraste=ImageEnhance.Contrast(imPostTraitC)
			imContraste.enhance(spin3).save(self.repTampon+'tmp_gds486fsf68q2wx5k7u1oop.png', 'PNG')
			# Ouverture de l'image posterizee ensuite contrastée poursuite du traitement ...
			imOpc=Image.open(self.repTampon+'tmp_gds486fsf68q2wx5k7u1oop.png')
			# Conversion en RGBA pour pouvoir compositer ...
			imOpc.convert('RGBA')
 
			# Partie finale --- Compositing entre les traits de la partie 1 et couleurs de partie 2 -
			# Attention il s'agit bien de l'image tampon: tmp_gds568ec4u5hg53g7s9m4rt.png
			# C'est l'image qui contient les traits noirs (contours des objets)
			# Traits noirs + le fond blanc a été remplacé par un fond transparent
			imFondTransp=Image.open(self.repTampon+'tmp_gds568ec4u5hg53g7s9m4rt.png')
			# Compositing (traitement final)
			compoContCoul=Image.composite(imFondTransp, imOpc, imFondTransp)
 
			# Sauvegarde
			self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
			compoContCoul.save(self.cheminCourantSauv)
 
			# Purge des fichiers dans le rep tampon
			os.remove(self.repTampon+'tmp_gds568ec4u5hg53g7s9m4rt.png')
			os.remove(self.repTampon+'tmp_gds89gfdt39xfg6d9qxx1f.png')
			os.remove(self.repTampon+'tmp_gds486fsf68q2wx5k7u1oop.png')
 
			# Fin
			if not self.opReccurApresApp(): return
			self.j += 1
 
 
	def appliquerNegatif(self):
		""" Negatif: inverse les couleurs (ou les valeurs en cas de conversion en noir et blanc) """
		for self.j in self.listeIndex:
			# Récupération de l'index et l'entrée du combo de sélection
			indexCombo = self.listeComboReglage[self.i][3].combo.currentIndex()
			entreeCombo = str(self.listeComboReglage[self.i][3].combo.itemData(indexCombo).toStringList()[0])
			# Ouverture des images
			obImg = Image.open(self.listeImgSource[self.j])
			if entreeCombo=='negatif_couleur':
				negatif = ImageOps.invert(obImg)
			elif entreeCombo=='negatif_n_et_b':
				obImg = obImg.convert("L")
				negatif = ImageOps.invert(obImg)
			# Sauvegarde
			self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext ##
			negatif.save(self.cheminCourantSauv)
			# Fin
			if not self.opReccurApresApp(): return
			self.j += 1
 
 
	def appliquerEncadrePhoto(self):
		""" Encadrement photographique: appose un cadre autour des images """
		for self.j in self.listeIndex:
			# Récupération de l'index et l'entrée du combo de sélection
			indexCombo = self.listeComboReglage[self.i][3].combo.currentIndex()
			entreeCombo = str(self.listeComboReglage[self.i][3].combo.itemData(indexCombo).toStringList()[0])
			# Ouverture des images
			obImg = Image.open(self.listeImgSource[self.j])
			if entreeCombo=='noir': couleur = (0, 0, 0)
			elif entreeCombo=='gris': couleur = (128, 128, 128)
			elif entreeCombo=='blanc': couleur = (255, 255, 255)
			elif entreeCombo=='rouge': couleur = (255, 0, 0)
			elif entreeCombo=='vert': couleur = (0, 255, 0)
			elif entreeCombo=='bleu': couleur = (0, 0, 255)
			elif entreeCombo=='jaune': couleur = (255, 255, 0)
			# Application du filtre
			cadre = ImageOps.expand(obImg, 40, couleur)
			# Sauvegarde
			self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
			cadre.save(self.cheminCourantSauv)
			# Fin
			if not self.opReccurApresApp(): return
			self.j += 1
 
 
	def appliquerOmbreEtLumALaCouleur(self):
		""" Ombre et lumière à la couleur (un espèce de seuillage mais avec des couleurs) """
		# Récup de l'index du filtre
		i=self.comboReglage.currentIndex()
		ll=[]
		for k in range(4):
			for l in range(2):
				ll.append(self.listeComboReglage[i][3].spin[k][l].value())
		lValCoul=[ll[0], ll[2], ll[4], ll[6], ll[1], ll[3], ll[5], ll[7]]
		# Boucle principale
		for self.j in self.listeIndex:
			# Ouverture des images
			obImg = Image.open(self.listeImgSource[self.j])
			# Conversion et sauvegarde en niveaux de gris
			imageNDG = obImg.convert("L")
			# Recup dimensions de l'image
			wSeuil, hSeuil = imageNDG.size
			# Filtre egalisateur pour renforcer les zones claires et les zones foncées
			egaliseNDG_Seuil = ImageOps.equalize(imageNDG)
			# Creation d'une nouvelle image
			nouvImgNDG_Seuil = Image.new("L", (wSeuil, hSeuil))
			# Insertion data ds nouvImgNDG_Seuil
			nouvImgNDG_Seuil.putdata(egaliseNDG_Seuil.getdata())
			# Récup des données contenues ds l'image et mises dans un tableau par Numpy
			dataNDG_Seuil=array(nouvImgNDG_Seuil)#.reshape(wSeuil*hSeuil, 3)
			# Aplatissement du tableau pour traitement
			aplatNDG_Seuil=dataNDG_Seuil.flat
			# Condition: (apres parcours de chaque element du tableau)
			# ==> correspond en python classique a :
			# if aplatNDG_Seuil>=spin1 and aplatNDG_Seuil<=spin2:
			# Les pixels blancs seront placés ici.
			condSeuil=(aplatNDG_Seuil>=128)&(aplatNDG_Seuil<=255)
			# Selon la condition, remplacement de chaque element/pixel
			# soit par 0 --> noir, soit par 255 --> blanc .
			idSeuil=where(condSeuil, 0, 255)
			# Insertion data et conversion en liste classique
			transListe=idSeuil.tolist()
			# Multiplication des données en 4 canaux et insertion en une liste de listes
			# comme ceci: [[255, 255, 255, 255], [255, 255, 255, 255], [0, 0, 0, 0], ...]
			# Le fait qu'il y ait 4 canaux est fait pour la gestion du canal alpha
			quatreCanaux=[[parcTrans]*4 for parcTrans in transListe]
			# Transformation de la liste de listes en liste de tuples
			transTuple=[tuple(parcTuple) for parcTuple in quatreCanaux]
			# Insertion des données (les blancs sont transformés en une couleur, les
			# noir en une autre, couleurs choisies par l'utilisateur)
			listeDonnees=[]
			for parcDonnees in transTuple:
				if parcDonnees==(255, 255, 255, 255):
					parcDonnees=(lValCoul[0], lValCoul[1], lValCoul[2], lValCoul[3])
					listeDonnees.append(parcDonnees)
				elif parcDonnees==(0, 0, 0, 0):
					parcDonnees=(lValCoul[4], lValCoul[5], lValCoul[6], lValCoul[7])
					listeDonnees.append(parcDonnees)
			# Creation d'une nouvelle image
			nouvImg=Image.new("RGBA", (wSeuil, hSeuil))
			# Insertion data ds nouvImgBinaire et conversion en liste classique
			nouvImg.putdata(listeDonnees)
			# Comme un canal alpha peut être appliqué à l'image sauvegardée, il vaut
			# mieux sauvegarder avec une extension qui supporte la transparence
			if self.ext not in ['.png', '.gif', '.tga']:
				self.ext='.png'
			# Sauvegarde
			self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
			nouvImg.save(self.cheminCourantSauv)
			# Fin
			if not self.opReccurApresApp(): return
			self.j += 1
 
 
	def appliquerRotationImage(self):
		""" Rotation des images (90, 180 et 270 vers la gauche) """
		for self.j in self.listeIndex:
			# Récupération de l'index et l'entrée du combo de sélection
			indexCombo = self.listeComboReglage[self.i][3].combo.currentIndex()
			entreeCombo = str(self.listeComboReglage[self.i][3].combo.itemData(indexCombo).toStringList()[0])
			# Ouverture des images
			obImg = Image.open(self.listeImgSource[self.j])
			#
			if entreeCombo=='rot_img_90_gauche': rot = 90
			elif entreeCombo=='rot_img_180_gauche': rot = 180
			elif entreeCombo=='rot_img_270_gauche': rot = 270
			# Application du filtre
			self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
			obImg.rotate(rot).save(self.cheminCourantSauv)
			# Fin
			if not self.opReccurApresApp(): return
			self.j += 1
 
 
	def appliquerImitationBd_2(self):
		""" Dessin 11: imitation bande dessinée (avec intégration [un peu] de syntaxe Numpy) """
		for self.j in self.listeIndex:
			# Récup réglages ci-dessous
			spin1 = self.listeComboReglage[self.i][3].spin.value() # intensité des traits
			spin2 = str(self.listeComboReglage[self.i][3].spin2.value()) # flou des couleurs
 
			# Partie 1 --- Travail avec l'image de fond (couleurs floutées) ------------------------- #
 
			process = QProcess(self)
 
			# Uniquement pour Linux et MacOSX
			if os.name in ['posix', 'mac']:
 
				process.start("convert -noise "+spin2+" -gamma 1.4 "+"\""+self.listeImgSource[self.j]+"\""+' '+"\""+self.repTampon+'tmp_gtyj58h6fdh2fyyw478105tu.png'+"\"")
				if not process.waitForStarted(3000):
					QMessageBox.warning(None, _(u"Erreur"), _(u"Bogue au lancement de la commande"))
				process.waitForFinished(-1)
 
			# Uniquement pour windows
			elif os.name == 'nt':
 
				# Attention ici dans la version windows ce n'est pas traité par un 
				# QProcess (comme sous Linux) mais directement avec os.system (car le
				# QProcess avec la commande convert d'ImageMagick génère une erreur)
				os.system(("convert -noise "+spin2+" -gamma 1.4 "+"\""+self.listeImgSource[self.j]+"\""+' '+"\""+self.repTampon+'tmp_gtyj58h6fdh2fyyw478105tu.png'+"\"").encode(locale.getdefaultlocale()[1]))
 
			# --------------------------------------------------------------------------------------- #
 
			# Partie 2 ------ Détection du contour des formes et traçage des futurs traits noirs ---- #
 
			# Ouverture des images. Conversion et sauvegarde en niveaux de gris
			obImg = Image.open(self.listeImgSource[self.j]).convert("L")
			# Recup dimensions de l'image
			w, h = obImg.size
 
			# Kernel 5x5 Réduction du Bruit + ajout de la valeur de spin1 au centre de la matrice
			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)))
			imKernel.save(self.repTampon+'tmp_g9wxgfdg55t864vs156gmox4wse156sf.png', 'PNG')
			# Ouverture de l'image temporaire
			ouvImg = Image.open(self.repTampon+'tmp_g9wxgfdg55t864vs156gmox4wse156sf.png')
			# Filtre egalisateur pour renforcer les zones claires et les zones foncées
			egalise = ImageOps.equalize(ouvImg)
			# Creation d'une nouvelle image
			nouvImg = Image.new("L", (w, h))
			# Insertion data ds nouvImg
			nouvImg.putdata(egalise.getdata())
			# Récup des données contenues ds l'image et mises dans un tableau par Numpy
			data = array(nouvImg)
			# Aplatissement du tableau pour traitement
			aplat = data.flat
			# Condition: (apres parcours de chaque element du tableau)
			condition = (aplat>=1)&(aplat<=255)
			# Selon la condition, remplacement de chaque element/pixel
			# soit par 255 --> blanc, soit par 0 --> noir
			idCond = where(condition, 255, 0)
			# Creation d'une nouvelle image
			nouvImgBinaire = Image.new("L", (w, h))
			# Insertion data ds nouvImgBinaire et conversion en liste classique
			nouvImgBinaire.putdata(idCond.tolist())
			# Recup des donnees
			listeAlpha_1=list(nouvImgBinaire.getdata())
			# Creation de la liste newListRGBAbin
			newListRGBAbin=[]
			for parcListe in listeAlpha_1:
				# Si on a des pixels blancs et transparents dans listeAlpha_1 alors on injecte
				# des pixels blancs transparents mais ce  coup-ci en mode RGBA .
				if parcListe==255: newListRGBAbin.append((255, 255, 255, 0))
				# (Autre) si on a des pixels noirs et opaques dans listeAlpha_1
				# alors on injecte des pixels noirs opaques mais ce coup-ci en
				# mode RGBA .
				else: newListRGBAbin.append((0, 0, 0, 255))
 
			# Creation d'une nouvelle image
			nouvImgRGBA=Image.new("RGBA", (w, h))
			# Insertion data ds nouvImgRGBA
			nouvImgRGBA.putdata(newListRGBAbin)
			# Sauvegarde image temporaire
			nouvImgRGBA.save(self.repTampon+'tmp_g9wxgfdg55t864vs156gmox4wse156sf.png', 'PNG')
 
			# --------------------------------------------------------------------------------------- #
 
			# Partie finale --- Compositing entre les traits de la partie 1 et couleurs de partie 2 - #
 
			# Ouverture de l'image de fond (couleurs floutées) et conversion en RGBA
			imOpc=Image.open(self.repTampon+'tmp_gtyj58h6fdh2fyyw478105tu.png')
			imOpc.convert('RGBA')
			# Attention il s'agit bien de l'image tampon: tmp_g9wxgfdg55t864vs156gmox4wse156sf.png
			# C'est l'image qui contient les traits noirs (contours des objets)
			# Traits noirs + le fond blanc a été remplacé par un fond transparent
			imFondTransp=Image.open(self.repTampon+'tmp_g9wxgfdg55t864vs156gmox4wse156sf.png')
			# Compositing (traitement final)
			compoContCoul=Image.composite(imFondTransp, imOpc, imFondTransp)
 
			# Sauvegarde
			self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
			compoContCoul.save(self.cheminCourantSauv)
 
			# Purge des fichiers dans le rep tampon
			os.remove(self.repTampon+'tmp_gtyj58h6fdh2fyyw478105tu.png')
			os.remove(self.repTampon+'tmp_g9wxgfdg55t864vs156gmox4wse156sf.png')
 
			# Fin
			if not self.opReccurApresApp(): return
			self.j += 1
 
 
	def appliquerLaplacien_1(self):
		""" Dessin 12: laplacien """
		for self.j in self.listeIndex:
			# Récupération de l'index et l'entrée du combo de sélection
			indexCombo = self.listeComboReglage[self.i][3].combo.currentIndex()
			entreeCombo = str(self.listeComboReglage[self.i][3].combo.itemData(indexCombo).toStringList()[0])
			# Application du filtre
			self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
			if entreeCombo=="laplacien_1_noir_et_blanc":
				# Conversion de l'image en niveaux de gris
				obImg = Image.open(self.listeImgSource[self.j]).convert('L')
			elif entreeCombo=="laplacien_1_couleur":
				# Conversion de l'image en RGB
				obImg = Image.open(self.listeImgSource[self.j]).convert('RGB')
			sizeKern5x5=(5, 5)
			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)
			imKernelLaplacien_1 = obImg.filter(ImageFilter.Kernel(sizeKern5x5, kernLaplacien_1)).save(self.cheminCourantSauv)
			# Fin
			if not self.opReccurApresApp(): return
			self.j += 1
 
 
	def appliquerContourEtCouleur(self):
		""" Ce filtre est le mélange d'une partie (pour les traits de contour) du filtre 
		Dessin 10: imitation bande dessinée et du filtre Ombre et lumière à la couleur """
 
		for self.j in self.listeIndex:
 
			# Récup réglages ci-dessous
			#
			#spin1 = self.listeComboReglage[self.i][3].spin1.value() # intensité des traits
			#
			# Récup de l'index du filtre
			i=self.comboReglage.currentIndex()
			# Récup des données --> couleurs pour l'ombre, couleurs pour la lumière
			ll=[]
			for k in range(4):
				for l in range(2):
					ll.append(self.listeComboReglage[i][3].spin[k][l].value())
			lValCoul=[ll[0], ll[2], ll[4], ll[6], ll[1], ll[3], ll[5], ll[7]]
			#
			# Récuperération de la couleur du trait de contour
			coul_rouge_trait = self.listeComboReglage[i][3].spin[0][2].value() # rouge
			coul_vert_trait = self.listeComboReglage[i][3].spin[1][2].value() # vert
			coul_bleu_trait = self.listeComboReglage[i][3].spin[2][2].value() # bleu
			transparence_trait = self.listeComboReglage[i][3].spin[3][2].value() # transparence
			# Valeur de l'intensité du trait
			val_intens_trait = self.listeComboReglage[i][3].spin[len(self.listeComboReglage[i][3].spin)-1].value()
 
			# -------------------------------------------------------------------
			# Partie trait/contour
			# -------------------------------------------------------------------
			# Ouverture des images. Conversion et sauvegarde en niveaux de gris
			obImg_1 = Image.open(self.listeImgSource[self.j]).convert("L")
			# Recup dimensions de l'image
			w, h = obImg_1.size
 
			# Détection du contour des formes et traçage des futurs traits noirs -
			# Kernel 5x5 Réduction du Bruit + ajout de la valeur de spin1 au centre de la matrice
			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)))
			imKernel.save(self.repTampon+'tmp_df7f684qf466wrt84fk8ffs74doqsf48g.png', 'PNG')
			# Ouverture de l'image temporaire
			ouvImg = Image.open(self.repTampon+'tmp_df7f684qf466wrt84fk8ffs74doqsf48g.png')
			# Filtre egalisateur pour renforcer les zones claires et les zones foncées
			egalise = ImageOps.equalize(ouvImg)
			# Creation d'une nouvelle image
			nouvImg = Image.new("L", (w, h))
			# Insertion data ds nouvImg
			nouvImg.putdata(egalise.getdata())
			# Récup des données contenues ds l'image et mises dans un tableau par Numpy
			data = array(nouvImg)
			# Aplatissement du tableau pour traitement
			aplat = data.flat
			# Condition: (apres parcours de chaque element du tableau)
			condition = (aplat>=1)&(aplat<=255)
			# Selon la condition, remplacement de chaque element/pixel
			# soit par 255 --> blanc, soit par 0 --> noir
			idCond = where(condition, 255, 0)
			# Creation d'une nouvelle image
			nouvImgBinaire = Image.new("L", (w, h))
			# Insertion data ds nouvImgBinaire et conversion en liste classique
			nouvImgBinaire.putdata(idCond.tolist())
			# Recup des donnees
			listeAlpha_1=list(nouvImgBinaire.getdata())
			# Creation de la liste newListRGBAbin
			newListRGBAbin=[]
			for parcListe in listeAlpha_1:
				# Si on a des pixels blancs et transparents dans listeAlpha_1 alors on injecte
				# des pixels blancs transparents mais ce  coup-ci en mode RGBA .
				if parcListe==255: newListRGBAbin.append((255, 255, 255, 0))
				# (Autre) si on a des pixels noirs et opaques dans listeAlpha_1
				# alors on injecte des pixels noirs opaques mais ce coup-ci en
				# mode RGBA.
				else: newListRGBAbin.append((coul_rouge_trait, coul_vert_trait, coul_bleu_trait, transparence_trait))
 
			# Creation d'une nouvelle image
			nouvImgRGBA=Image.new("RGBA", (w, h))
			# Insertion data ds nouvImgRGBA
			nouvImgRGBA.putdata(newListRGBAbin)
			# Sauvegarde image temporaire
			nouvImgRGBA.save(self.repTampon+'tmp_df7f684qf466wrt84fk8ffs74doqsf48g.png', 'PNG')
			# -------------------------------------------------------------------
 
			# -------------------------------------------------------------------
			# Partie couleur (ombre et lumière)
			# -------------------------------------------------------------------
			# Ouverture des images
			obImg_2 = Image.open(self.listeImgSource[self.j])
			# Conversion et sauvegarde en niveaux de gris
			imageNDG = obImg_2.convert("L")
			# Recup dimensions de l'image
			wSeuil, hSeuil = imageNDG.size
			# Filtre egalisateur pour renforcer les zones claires et les zones foncées
			egaliseNDG_Seuil = ImageOps.equalize(imageNDG)
			# Creation d'une nouvelle image
			nouvImgNDG_Seuil = Image.new("L", (wSeuil, hSeuil))
			# Insertion data ds nouvImgNDG_Seuil
			nouvImgNDG_Seuil.putdata(egaliseNDG_Seuil.getdata())
			# Récup des données contenues ds l'image et mises dans un tableau par Numpy
			dataNDG_Seuil=array(nouvImgNDG_Seuil)#.reshape(wSeuil*hSeuil, 3)
			# Aplatissement du tableau pour traitement
			aplatNDG_Seuil=dataNDG_Seuil.flat
			# Condition: (apres parcours de chaque element du tableau)
			# ==> correspond en python classique a :
			# if aplatNDG_Seuil>=spin1 and aplatNDG_Seuil<=spin2:
			# Les pixels blancs seront placés ici.
			condSeuil=(aplatNDG_Seuil>=128)&(aplatNDG_Seuil<=255)
			# Selon la condition, remplacement de chaque element/pixel
			# soit par 0 --> noir, soit par 255 --> blanc .
			idSeuil=where(condSeuil, 0, 255)
			# Insertion data et conversion en liste classique
			transListe=idSeuil.tolist()
			# Multiplication des données en 4 canaux et insertion en une liste de listes
			# comme ceci: [[255, 255, 255, 255], [255, 255, 255, 255], [0, 0, 0, 0], ...]
			# Le fait qu'il y ait 4 canaux est fait pour la gestion du canal alpha
			quatreCanaux=[[parcTrans]*4 for parcTrans in transListe]
			# Transformation de la liste de listes en liste de tuples
			transTuple=[tuple(parcTuple) for parcTuple in quatreCanaux]
			# Insertion des données (les blancs sont transformés en une couleur, les
			# noir en une autre, couleurs choisies par l'utilisateur)
			listeDonnees=[]
			for parcDonnees in transTuple:
				if parcDonnees==(255, 255, 255, 255):
					parcDonnees=(lValCoul[0], lValCoul[1], lValCoul[2], lValCoul[3])
					listeDonnees.append(parcDonnees)
				elif parcDonnees==(0, 0, 0, 0):
					parcDonnees=(lValCoul[4], lValCoul[5], lValCoul[6], lValCoul[7])
					listeDonnees.append(parcDonnees)
			# Creation d'une nouvelle image
			nouvImg=Image.new("RGBA", (wSeuil, hSeuil))
			# Insertion data ds nouvImgBinaire et conversion en liste classique
			nouvImg.putdata(listeDonnees)
			nouvImg.save(self.repTampon+'tmp_gg48rg68aaafgabw686u8sdv8s8f5w9d.png', 'PNG')
			# Comme un canal alpha peut être appliqué à l'image sauvegardée, il vaut
			# mieux sauvegarder avec une extension qui supporte la transparence
			if self.ext not in ['.png', '.gif', '.tga']:
				self.ext='.png'
			# -------------------------------------------------------------------
 
			# -------------------------------------------------------------------
			# Compositing
			# -------------------------------------------------------------------
			imFondTransp=Image.open(self.repTampon+'tmp_df7f684qf466wrt84fk8ffs74doqsf48g.png')
			compoContCoul=Image.composite(imFondTransp, nouvImg, imFondTransp)
			# -------------------------------------------------------------------
 
			# Sauvegarde
			self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
			compoContCoul.save(self.cheminCourantSauv)
 
			os.remove(self.repTampon+'tmp_df7f684qf466wrt84fk8ffs74doqsf48g.png')
			os.remove(self.repTampon+'tmp_gg48rg68aaafgabw686u8sdv8s8f5w9d.png')
 
			# Fin
			if not self.opReccurApresApp(): return
			self.j += 1
 
 
	def arretProgression(self):
		"""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."""
		if self.listeComboReglage[self.i][1] in self.filtresPython: return
		self.terminerFiltreShell = 1
		self.process.kill()
		if len(self.listeImgDestin)!=0:
			self.conversionImg = 1
			self.logFinal(self.listeComboReglage[self.i][0])
			self.tabwidget.setCurrentIndex(self.indexTabImgInfos)
		else: # Onglet de log -> on remet les infos de départ
			self.zoneAffichInfosImg.setText(self.infosImgTitre[0]+"\n".join(self.listeImgSource))
 
 
	def finConversion(self, statutDeSortie):
		"""Choses à faire à la fin de l'encodage d'une image quand le filtre sélectionné est constitué d'une seule commande shell"""
 
		if statutDeSortie==1:
			print "Problème lors de la conversion!"
			messageAide=QMessageBox(self)
			messageAide.setText(_(u"Une erreur s'est produite durant la conversion"))
			messageAide.setWindowTitle(_(u"Aide"))
			messageAide.setIcon(QMessageBox.Warning)
			messageAide.exec_()
			self.logFinal(self.listeComboReglage[self.i][0])
			self.tabwidget.setCurrentIndex(self.indexTabImgInfos)
			return
 
		# On ne continue pas si l'utilisateur l'a décidé
		elif self.terminerFiltreShell: return
 
		# On passe à l'image suivante s'il en reste
		elif self.opReccurApresApp():
			self.appliquer()
 
 
	def opReccurApresApp(self):
		"""Opérations à effectuer après chaque appel du moteur."""
		if self.listeComboReglage[self.i][1] in self.filtresPython:
			modulePython = 1 # conversion python (+ shell pour certains filtres)
		else: modulePython = 0 # conversion 100% shell
 
		self.listeImgDestin.append(self.cheminCourantSauv)
		pourCent=int((float(self.j+1)/self.nbrImg)*100)
 
		self.progress.setValue(pourCent)
		#!!!Rafraichissement indispensable pour la transmission immédiate du signal QProgressDialog().wasCanceled
		if modulePython: QApplication.processEvents()
 
		# Incrémentation de l'indice du fichier source pour une conversion 100% commande shell
		if not modulePython: self.j += 1
 
		# Opérations de fin de conversion
		if pourCent==100:
			# Condition à respecter pour qu'un affichage d'une nouvelle image ait lieu dans l'onglet "Images après traitement"
			self.conversionImg = 1
			# Boite de dialogue d'information
			messageAide=QMessageBox(self)
			messageAide.setText(_(u"Le filtre a été appliqué avec succès!"))
			messageAide.setWindowTitle(self.listeComboReglage[self.i][0])
			messageAide.setIcon(QMessageBox.Information)
			messageAide.exec_()
			# Mise-à-jour du log
			self.logFinal(self.listeComboReglage[self.i][0])
			# Changement d'onglet et fonctions associées
			self.metaFctTab(self.indexTabImgDestin)
			return 0
 
		# Opérations à faire lors de l'arrêt de la conversion suite au clic sur le bouton annuler de la barre de progression
		elif self.progress.wasCanceled():
			if modulePython:
				# Condition à respecter pour qu'un affichage d'une nouvelle image ait lieu dans l'onglet "Images après traitement"
				self.conversionImg = 1
				# Mise-à-jour du log
				self.logFinal(self.listeComboReglage[self.i][0])
				# Affichage de l'onglet d'infos
				self.tabwidget.setCurrentIndex(self.indexTabImgInfos)
			return 0
 
		return 1
 
 
	def visu_1ere_img(self):
		"""Fonction pour faire une simulation de rendu (avec les réglages opérés dans l'onglet Réglages)
		et ce à partir du bouton Aperçu à partir de la première image, toujours dans l'onglet Réglages"""
 
		file = self.afficheurImgSource.getFile()
		if not file:
			return
 
		self.listeImgSource=[file] # changer la suite
		# et virer les crochets de cette liste
 
		# Récup de l'index du filtre
		i=self.comboReglage.currentIndex()
 
		self.cheminCourantSauv = self.repTampon+'image_visu_'+string.zfill(1, 6)+'.png'
 
		#------------------------------
		# Filtres 100% commande shell
		#------------------------------
 
		#------------------------------
		# Gestion par ImagMagick
		#------------------------------
 
		# locale est importé ici
		import locale
 
		if self.listeComboReglage[i][1] in ['sepia','traits_noirs','peu_couleur','peinture_huile',\
					'gamma','fonce_clair','peinture_eau','bas_relief']:
			spin = str(self.listeComboReglage[i][3].spin.value())
			if self.listeComboReglage[i][1]=='sepia':
				os.system(("convert -sepia-tone "+spin+"% -monitor "+"\""+self.listeImgSource[0]+"\""+' '+"\""+self.cheminCourantSauv+"\"").encode(locale.getdefaultlocale()[1]))
			elif self.listeComboReglage[i][1]=='traits_noirs':
				os.system(("convert -charcoal "+spin+" -monochrome "+"\""+self.listeImgSource[0]+"\""+' '+"\""+self.cheminCourantSauv+"\"").encode(locale.getdefaultlocale()[1]))
			elif self.listeComboReglage[i][1]=='peu_couleur':
				os.system(("convert -enhance -equalize -edge "+spin+" -colorize 6,12,20 "+"\""+self.listeImgSource[0]+"\""+' '+"\""+self.cheminCourantSauv+"\"").encode(locale.getdefaultlocale()[1]))
			elif self.listeComboReglage[i][1]=='peinture_huile':
				os.system(("convert -paint "+spin+' '+"\""+self.listeImgSource[0]+"\""+' '+"\""+self.cheminCourantSauv+"\"").encode(locale.getdefaultlocale()[1]))
			elif self.listeComboReglage[i][1]=='gamma':
				os.system(("convert -gamma "+spin+' '+"\""+self.listeImgSource[0]+"\""+' '+"\""+self.cheminCourantSauv+"\"").encode(locale.getdefaultlocale()[1]))
			elif self.listeComboReglage[i][1]=='fonce_clair':
				os.system(("convert -modulate "+spin+' '+"\""+self.listeImgSource[0]+"\""+' '+"\""+self.cheminCourantSauv+"\"").encode(locale.getdefaultlocale()[1]))
			elif self.listeComboReglage[i][1]=='peinture_eau':
				os.system(("convert -noise "+spin+" -gamma 1.4 "+"\""+self.listeImgSource[0]+"\""+' '+"\""+self.cheminCourantSauv+"\"").encode(locale.getdefaultlocale()[1]))
			elif self.listeComboReglage[i][1]=='bas_relief':
				os.system(("convert -paint "+spin+" -shade 120x45 "+"\""+self.listeImgSource[0]+"\""+' '+"\""+self.cheminCourantSauv+"\"").encode(locale.getdefaultlocale()[1]))
 
		elif self.listeComboReglage[i][1] in ['crayon_papier_1','floutage','trait_couleur_fond_noir']:
			spin1 = str(self.listeComboReglage[i][3].spin1.value())
			spin2 = str(self.listeComboReglage[i][3].spin2.value())
			if self.listeComboReglage[i][1]=='crayon_papier_1':
				os.system(("convert -spread "+spin2+" -charcoal "+spin1+' '+"\""+self.listeImgSource[0]+"\""+' '+"\""+self.cheminCourantSauv+"\"").encode(locale.getdefaultlocale()[1]))
			elif self.listeComboReglage[i][1]=='floutage':
				os.system(("convert -blur "+spin1+'%'+'x'+spin2+"% "+"\""+self.listeImgSource[0]+"\""+' '+"\""+self.cheminCourantSauv+"\"").encode(locale.getdefaultlocale()[1]))
			elif self.listeComboReglage[i][1]=='trait_couleur_fond_noir':
				os.system(("convert -median "+spin1+" -edge "+spin2+' '+"\""+self.listeImgSource[0]+"\""+' '+"\""+self.cheminCourantSauv+"\"").encode(locale.getdefaultlocale()[1]))
 
		elif self.listeComboReglage[i][1]=='monochrome':
			os.system(("convert -monochrome "+"\""+self.listeImgSource[0]+"\""+' '+"\""+self.cheminCourantSauv+"\"").encode(locale.getdefaultlocale()[1]))
 
		elif self.listeComboReglage[i][1]=='pointillisme':
			indexCombo = self.listeComboReglage[i][3].combo.currentIndex()
			entreeCombo = str(self.listeComboReglage[i][3].combo.itemData(indexCombo).toStringList()[0])
			os.system(("convert +noise "+entreeCombo+' '+"\""+self.listeImgSource[0]+"\""+' '+"\""+self.cheminCourantSauv+"\"").encode(locale.getdefaultlocale()[1]))
			'''
			elif self.listeComboReglage[i][1]=='craie_blanche':
			os.system("convert -blur 2x2 -fx 'log(r*60*pi)' -edge 0.1 -blur 2x2 "+"\""+self.listeImgSource[0]+"\""+' '+"\""+self.cheminCourantSauv+"\"")
			'''
 
		#------------------------------
		# Gestion par G'MIC
		#------------------------------
 
		### ATTENTION ######################################################################
		# "\"" a été remplacé par "\\\"" car G'MIC demande une syntaxe du style: 
		# gmic \"mon nom de fichier avec espace.jpg\" ... pour pouvoir traiter des fichiers
		# avec des espaces dans son nom
		####################################################################################
 
 
		########Rajout le 4/02/2011 par LUCAS Thomas et CABANA Antoine##################
		if self.listeComboReglage[i][1] in ['dessin_13_couleur', 'crayon_papier_2', 'polaroid', 'vieille_photo', 'oeilleton', 'cubisme_analytique', 'andy_warhol', 'expressionnisme', 'correct_yeux_rouges', 'solarisation', 'bull_en_tableau', 'la_planete_1', 'vision_thermique','enflamme','predator']:
		################################################################################
 
			if self.listeComboReglage[i][1]=='dessin_13_couleur':
				#################################################
				# Pour Dessin 13: couleur:
				# ------------------------
				# spin1 --> Amplitude
				#################################################
				spin1 = self.listeComboReglage[i][3].spin1.value()
				spin1 = str(spin1/100)
				os.system(("gmic "+"\\\""+self.listeImgSource[0]+"\\\""+" -drawing "+spin1+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
			elif self.listeComboReglage[i][1]=='crayon_papier_2':
				#################################################
				# Pour Dessin 14: crayon à papier 2:
				# ----------------------------------
				# spin1 --> Taille
				#################################################
				spin1 = self.listeComboReglage[i][3].spin1.value()
				spin1 = str(spin1/10)
				os.system(("gmic "+"\\\""+self.listeImgSource[0]+"\\\""+" -pencilbw "+spin1+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
			elif self.listeComboReglage[i][1]=='correct_yeux_rouges':
				#################################################
				# Pour Correction des yeux rouges:
				# --------------------------------
				# spin1 --> Seuil des couleurs
				# spin2 --> Lissage
				# spin3 --> Atténuation
				#################################################
				spin1 = self.listeComboReglage[i][3].spin1.value()
				# Si spin1 réglé sur 1 en fait spin vaut 0
				if spin1 == 1: spin1 = 0
				# Si la valeur de spin1 est supérieure à 1 on retranche 1
				if spin1 > 1: spin1 = spin1 - 1
				spin1 = str(spin1)
				spin2 = self.listeComboReglage[i][3].spin2.value()
				spin2 = str(spin2/10.0)
				spin3 = self.listeComboReglage[i][3].spin3.value()
				spin3 = str(spin3/10.0)
				os.system(("gmic "+"\\\""+self.listeImgSource[0]+"\\\""+" -red_eye "+spin1+','+spin2+','+spin3+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
			elif self.listeComboReglage[i][1]=='solarisation':
				os.system(("gmic "+"\\\""+self.listeImgSource[0]+"\\\""+" -solarize -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
			elif self.listeComboReglage[i][1]=='oeilleton':
				#################################################
				# Pour Oeilleton:
				# ---------------
				# spin1 --> Position sur la largeur
				# spin2 --> Position sur la hauteur
				# spin3 --> Rayon
				# spin4 --> Amplitude
				#################################################
				spin1 = str(self.listeComboReglage[i][3].spin1.value())
				spin2 = str(self.listeComboReglage[i][3].spin2.value())
				spin3 = str(self.listeComboReglage[i][3].spin3.value())
				spin4 = str(self.listeComboReglage[i][3].spin4.value())
				os.system(("gmic "+"\\\""+self.listeImgSource[0]+"\\\""+" -fish_eye "+spin1+','+spin2+','+spin3+','+spin4+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
			elif self.listeComboReglage[i][1]=='polaroid':
				#################################################
				# Pour Polaroïd:
				# --------------
				# spin1 --> Taille de la bordure
				# spin2 --> Taille en largeur pour l'ombre
				# spin3 --> Taille en hauteur pour l'ombre
				# spin4 --> Rotation (en degrés) de  la photo
				#################################################
				spin1 = str(self.listeComboReglage[i][3].spin1.value())
				spin2 = str(self.listeComboReglage[i][3].spin2.value())
				spin3 = str(self.listeComboReglage[i][3].spin3.value())
				spin4 = str(self.listeComboReglage[i][3].spin4.value())
				os.system(("gmic "+"\\\""+self.listeImgSource[0]+"\\\""+" -polaroid "+spin1+" -drop_shadow "+spin2+','+spin3+" -rotate "+spin4+",1 -drgba -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
			elif self.listeComboReglage[i][1]=='vieille_photo':
				#################################################
				# Pour Vieille photo:
				# -------------------
				# spin1 --> Taille en largeur pour l'ombre
				# spin2 --> Taille en hauteur pour l'ombre
				# spin3 --> Rotation (en degrés) de  la photo
				#################################################
				spin1 = str(self.listeComboReglage[i][3].spin1.value())
				spin2 = str(self.listeComboReglage[i][3].spin2.value())
				spin3 = str(self.listeComboReglage[i][3].spin3.value())
				os.system(("gmic "+"\\\""+self.listeImgSource[0]+"\\\""+" -old_photo -drop_shadow "+spin1+','+spin2+" -rotate "+spin3+",1 -drgba -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
			elif self.listeComboReglage[i][1]=='cubisme_analytique':
				#################################################
				# Pour Cubisme analytique:
				# ------------------------
				# spin1 --> Itération
				# spin2 --> Taille de bloc
				# spin3 --> Angle
				#################################################
				spin1 = str(self.listeComboReglage[i][3].spin1.value())
				spin2 = str(self.listeComboReglage[i][3].spin2.value())
				spin3 = str(self.listeComboReglage[i][3].spin3.value())
				#self.process = EkdProcess(("gmic "+"\\\""+self.listeImgSource[0]+"\\\""+" -cubism "+spin1+','+spin2+','+spin3+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]), output = None, stdinput = None)
				os.system(("gmic "+"\\\""+self.listeImgSource[0]+"\\\""+" -cubism "+spin1+','+spin2+','+spin3+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
			elif self.listeComboReglage[i][1]=='andy_warhol':
				#################################################
				# Pour Andy Warhol:
				# -----------------
				# spin1 --> Nombre d'images par ligne
				# spin2 --> Nombre d'images par colonne
				# spin3 --> Lissage
				# spin4 --> Couleur
				#################################################
				spin1 = str(self.listeComboReglage[i][3].spin1.value())
				spin2 = str(self.listeComboReglage[i][3].spin2.value())
				spin3 = str(self.listeComboReglage[i][3].spin3.value())
				spin4 = str(self.listeComboReglage[i][3].spin4.value())
				os.system(("gmic "+"\\\""+self.listeImgSource[0]+"\\\""+" -warhol "+spin1+','+spin2+','+spin3+','+spin4+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
			elif self.listeComboReglage[i][1]=='expressionnisme':
				#################################################
				# Pour Expressionnisme:
				# ---------------------
				# spin1 --> Abstraction
				# spin2 --> Lissage
				# spin3 --> Couleur
				#################################################
				spin1 = str(self.listeComboReglage[i][3].spin1.value())
				spin2 = self.listeComboReglage[i][3].spin2.value()
				spin2 = str(spin2/100)
				spin3 = self.listeComboReglage[i][3].spin3.value()
				spin3 = str(spin3/100)
				os.system(("gmic "+"\\\""+self.listeImgSource[0]+"\\\""+" -gimp_painting "+spin1+','+spin2+','+spin3+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
			elif self.listeComboReglage[i][1]=='bull_en_tableau':
				#################################################
				# Pour Bulles en tableau:
				# -----------------------
				# spin1 --> Résolution en X
				# spin2 --> Résolution en Y
				# spin3 --> Rayon de la bulle
				# spin4 --> Bulles par ligne
				# spin5 --> Bulles par colonne
				# spin6 --> Largeur de la bordure
				# spin7 --> Hauteur de la bordure
				# spin8 --> Largeur finale de l'image
				# spin9 --> Hauteur finale de l'image
				#################################################
				spin1 = str(self.listeComboReglage[i][3].spin1.value())
				spin2 = str(self.listeComboReglage[i][3].spin2.value())
				spin3 = str(self.listeComboReglage[i][3].spin3.value())
				spin4 = str(self.listeComboReglage[i][3].spin4.value())
				spin5 = str(self.listeComboReglage[i][3].spin5.value())
				spin6 = str(self.listeComboReglage[i][3].spin6.value())
				spin7 = str(self.listeComboReglage[i][3].spin7.value())
				spin8 = str(self.listeComboReglage[i][3].spin8.value())
				spin9 = str(self.listeComboReglage[i][3].spin9.value())
				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]))
				# gmic in.jpg -mirror z -map_sphere 1024,1024,70 -array_fade 3,3 -frame_fuzzy 25,25 -resize 600,450 -o out.jpg
			elif self.listeComboReglage[i][1]=='la_planete_1':
				#################################################
				# Pour Bulles en tableau:
				# -----------------------
				# spin1 --> Position des doubles
				# spin2 --> Rayon de la planète
				# spin3 --> Dilatation
				# spin4 --> Largeur finale de l'image
				# spin5 --> Hauteur finale de l'image
				#################################################
				#spin1 = self.listeComboReglage[i][3].spin1.value()
				spin1 = str(self.listeComboReglage[i][3].spin1.value())
				spin2 = str(self.listeComboReglage[i][3].spin2.value())
				spin3 = self.listeComboReglage[i][3].spin3.value()
				spin3 = str(spin3/100.0)
				spin4 = str(self.listeComboReglage[i][3].spin4.value())
				spin5 = str(self.listeComboReglage[i][3].spin5.value())
				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]))
				# gmic in.jpg -repeat 2 --mirror x -a x -done -map_sphere 400,400,100,0.9 -o out.jpg
			########Rajout le 28/11/2010 par LUCAS Thomas et CABANA Antoine##################
			elif self.listeComboReglage[i][1]=='vision_thermique':
				#################################################
				# Pour Vision Thermique :
				# -----------------------
				# spin1 --> Minimum de Luminance
				# spin2 --> Maximum de Luminance
				#################################################
				spin1 = str(self.listeComboReglage[i][3].spin1.value())
				spin2 = str(self.listeComboReglage[i][3].spin2.value())
				'''
				if spin1 >= spin2:
					erreur=QMessageBox(self)
					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."))
					erreur.setWindowTitle(_(u"Erreur de réglage"))
					erreur.setIcon(QMessageBox.Warning)
					erreur.exec_()
					sys.exit
				else:
				#spin1 = str(self.listeComboReglage[i][3].spin1.value()) # Ce réglage est déjà définis plus haut ds le code
				#spin2 = str(self.listeComboReglage[i][3].spin2.value()) # Ce réglage est déjà définis plus haut ds le code
				'''
				os.system(("gmic "+"\\\""+self.listeImgSource[0]+"\\\""+ " -luminance -n "+spin1+','+spin2+" -negative -map 1 -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
				#########################################################################
				########Rajout le 4/02/2011 par LUCAS Thomas et CABANA Antoine##################
			elif self.listeComboReglage[i][1]=='enflamme':
				#################################################
				# Pour Enflamme :
				# -----------------------
				# spin1 --> Palette
				# spin2 --> Amplitude
				# spin3 --> Echantillonnage
				# spin4 --> Lissage
				# spin5 --> Opacité
				# spin6 --> Bord
				# spin7 --> Amplitude du lissage anisotropique
				# spin8 --> Netteté
				# spin9 --> Anisotropie
				# spin10 --> Gradiant de lissage
				# spin11 --> Tenseur de lissage
				# spin12 --> Précision spaciale
				# spin13 --> Précision angulaire
				# spin14 --> Valeur de la précision
				# spin15 --> Iterations
				#################################################
 
 
				spin1 = str(self.listeComboReglage[i][3].spin1.value()-1)
				spin2 = str(self.listeComboReglage[i][3].spin2.value())
				spin3 = str(self.listeComboReglage[i][3].spin3.value()/100.0)
				spin4 = str(self.listeComboReglage[i][3].spin4.value()/100.0)
				spin5 = str(self.listeComboReglage[i][3].spin5.value()/100.0)
				spin6 = str(self.listeComboReglage[i][3].spin6.value())
				spin7 = str(self.listeComboReglage[i][3].spin7.value())
				spin8 = str(self.listeComboReglage[i][3].spin8.value()/100.0)
				spin9 = str(self.listeComboReglage[i][3].spin9.value()/100.0)
				spin10 = str(self.listeComboReglage[i][3].spin10.value()/100.0)
				spin11 = str(self.listeComboReglage[i][3].spin11.value()/100.0)
				spin12 = str(self.listeComboReglage[i][3].spin12.value()/100.0)
				spin13 = str(self.listeComboReglage[i][3].spin13.value())
				spin14 = str(self.listeComboReglage[i][3].spin14.value()/100.0)
				spin15 = str(self.listeComboReglage[i][3].spin15.value())
 
				os.system(("gmic "+" -m fire2.gmic "+"\\\""+self.listeImgSource[0]+"\\\""+
					   " -fire "+spin1+','+spin2+','+spin3+','+spin4+','+spin5+','+spin6+','
					   	+spin7+','+spin8+','+spin9+','+spin10+','+spin11+','+spin12+','+spin13
					   	+','+spin14+','+spin15+" -o "
					   "\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
			#################################################################################
 
			#########################################################################
			########Rajout le 7/04/2011 par LUCAS Thomas et CABANA Antoine##################
			elif self.listeComboReglage[i][1]=='predator':
				#################################################
				# Pour Predator :
				# -----------------------
				#################################################
 
				filename=str(self.listeComboReglage[i][3].filename)				
 
 
				os.system(("gmic "+"\\\""+self.listeImgSource[0]+"\\\" "+filename + " -sub[1] [0] -n[1] 0,255 -sub[1] 50% -cut[1] 0,255  -negative[1] -light_relief[1] 0.3,0.001,0.1,0,0.2,0.5,0.5,1,1 -luminance[1] -add[0] [1] -remove[1] -n 0,255 -o[-1] " "\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
			#################################################################################
 
		#--------------------------------------------------------
		# Filtres utilisant notamment un module python (ex. PIL)
		#--------------------------------------------------------
 
		elif self.listeComboReglage[i][1]=='vieux_films':
			"""Conversion de la 1ère image en Vieux Film"""
			###################################################################
			# Les commentaires n'ont pas été gardés ici, pour savoir de quoi
			# il en retourne voir dans la fonction appliquerVieuxFilms
			###################################################################
			listePous=[
			'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',
			'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',
			'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',
			'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',
			'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',
			'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',
			'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',
			'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',
			'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',
			'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',
			'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',
			'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',
			'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']
 
			os.system(("convert -blur 1%x1% -fx intensity "+"\""+self.listeImgSource[0]+"\""+' '+"\""+self.repTampon+"vf_vieux_films1"+"\"").encode(locale.getdefaultlocale()[1]))
 
			img0=Image.open(self.listeImgSource[0])
			taille=img0.size
			# Pas besoin d'utiliser encode ici.
			os.system("convert "+"\""+listePous[0]+"\""+" -resize "+ str(taille[0])+'x'+str(taille[1])+"! "+"\""+self.repTampon+"vf_vieux_films2"+"\"")
			img1 = Image.open(self.repTampon+"vf_vieux_films2")
			img2 = Image.open(self.repTampon+"vf_vieux_films1")
			compos = Image.composite(img1,img2,img1)
			compos.save(self.cheminCourantSauv)
 
		elif self.listeComboReglage[i][1]=='illustration_niveau_gris':
			"""Conversion de la 1ère image en niveaux de gris"""
			obImg = Image.open(self.listeImgSource[0])
			convert = obImg.convert("1")
			convert.save(self.cheminCourantSauv)
 
		elif self.listeComboReglage[i][1]=='traits_fins&couleur':
			"""Conversion de la 1ère image en traits fins et couleur"""
			obImg = Image.open(self.listeImgSource[0])
			convert = obImg.filter(ImageFilter.EDGE_ENHANCE_MORE)
			convert.save(self.cheminCourantSauv)
 
		elif self.listeComboReglage[i][1]=='emboss':
			"""Conversion de la 1ère image en emboss"""
			obImg = Image.open(self.listeImgSource[0])
			convert = obImg.filter(ImageFilter.EMBOSS)
			convert.save(self.cheminCourantSauv)
 
		elif self.listeComboReglage[i][1]=='sharpen':
			"""Conversion de la 1ère image en sharpen"""
			obImg = Image.open(self.listeImgSource[0])
			convert = obImg.filter(ImageFilter.SHARPEN)
			convert.save(self.cheminCourantSauv)
 
		elif self.listeComboReglage[i][1]=='niveau_gris':
			"""Conversion de la 1ère image en niveau de gris"""
			obImg = Image.open(self.listeImgSource[0])
			convert = obImg.convert("L")
			convert.save(self.cheminCourantSauv)
 
		elif self.listeComboReglage[i][1]=='amelior_des_bords':
			"""Conversion de la 1ère image en ameliorant les bords"""
			obImg = Image.open(self.listeImgSource[0])
			convert = obImg.filter(ImageFilter.Kernel((3, 3), (-1, -2, -1, -2, 16, -2, -1, -2, -1)))
			convert.save(self.cheminCourantSauv)
 
		elif self.listeComboReglage[i][1]=='debruitage':
			"""Conversion de la 1ère image en debruitant"""
			obImg = Image.open(self.listeImgSource[0])
			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)))
			convert.save(self.cheminCourantSauv)
 
		elif self.listeComboReglage[i][1]=='evanescence':
			"""Conversion de la 1ère image en Dessin 9: traits noirs, fond blanc"""
			###################################################################
			# Les commentaires n'ont pas été gardés ici, pour savoir de quoi
			# il en retourne voir dans la fonction appliquerEvanescence
			###################################################################
			indexCombo = self.listeComboReglage[i][3].combo.currentIndex()
			entreeCombo = str(self.listeComboReglage[i][3].combo.itemData(indexCombo).toStringList()[0])
			obImg = Image.open(self.listeImgSource[0]).convert("L")
			w, h = obImg.size
			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)))
			imKernel.save(self.repTampon+'_tmp_g546gf546ezr53ww7i.png', 'PNG')
			ouvImg = Image.open(self.repTampon+'_tmp_g546gf546ezr53ww7i.png')
			egalise = ImageOps.equalize(ouvImg)
			nouvImg = Image.new("L", (w, h))
			nouvImg.putdata(egalise.getdata())
			data = array(nouvImg)
			aplat = data.flat
			condition=(aplat>=1)&(aplat<=255)
			if entreeCombo=='fond_blanc_lignes_noires': idCond = where(condition, 255, 0)
			elif entreeCombo=='fond_noir_lignes_blanches': idCond = where(condition, 0, 255)
			nouvImgBinaire=Image.new("L", (w, h))
			nouvImgBinaire.putdata(idCond.tolist())
			nouvImgBinaire.save(self.cheminCourantSauv)
			os.remove(self.repTampon+'_tmp_g546gf546ezr53ww7i.png')
 
		elif self.listeComboReglage[i][1]=='seuillage':
			"""Conversion de la 1ère image en Dessin 8: seuillage"""
			###################################################################
			# Les commentaires n'ont pas été gardés ici, pour savoir de quoi
			# il en retourne voir dans la fonction appliquerSeuillage
			###################################################################
			obImg = Image.open(self.listeImgSource[0])
			spin1 = self.listeComboReglage[i][3].spin1.value() # seuil bas
			spin2 = self.listeComboReglage[i][3].spin2.value() # seuil haut
			if spin1>=spin2:
				erreur=QMessageBox(self)
				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."))
				erreur.setWindowTitle(_(u"Erreur de réglage"))
				erreur.setIcon(QMessageBox.Warning)
				erreur.exec_()
				sys.exit
			else: pass
			imageNDG = obImg.convert("L")
			wSeuil, hSeuil = imageNDG.size
			egaliseNDG_Seuil = ImageOps.equalize(imageNDG)
			nouvImgNDG_Seuil = Image.new("L", (wSeuil, hSeuil))
			nouvImgNDG_Seuil.putdata(egaliseNDG_Seuil.getdata())
			dataNDG_Seuil=array(nouvImgNDG_Seuil)
			aplatNDG_Seuil=dataNDG_Seuil.flat
			condSeuil=(aplatNDG_Seuil>=spin1)&(aplatNDG_Seuil<=spin2)
			idSeuil=where(condSeuil, 0, 255)
			nouvImgBinaire=Image.new("L", (wSeuil, hSeuil))
			nouvImgBinaire.putdata(idSeuil.tolist())
			nouvImgBinaire.save(self.cheminCourantSauv)
 
		elif self.listeComboReglage[i][1]=='imitation_bd_1':
			"""Conversion de la 1ère image en Dessin 10: imitation bande dessinée"""
			###################################################################
			# Les commentaires n'ont pas été gardés ici, pour savoir de quoi
			# il en retourne voir dans la fonction appliquerImitationBd
			###################################################################
			spin1 = self.listeComboReglage[i][3].spin1.value() # intensité des traits
			spin2 = self.listeComboReglage[i][3].spin2.value() # réduction des couleurs
			spin3 = self.listeComboReglage[i][3].spin3.value() # contraste de couleurs
			obImg = Image.open(self.listeImgSource[0]).convert("L")
			w, h = obImg.size
			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)))
			imKernel.save(self.repTampon+'tmp_gds568ec4u5hg53g7s9m4rt.png', 'PNG')
			ouvImg = Image.open(self.repTampon+'tmp_gds568ec4u5hg53g7s9m4rt.png')
			egalise = ImageOps.equalize(ouvImg)
			nouvImg = Image.new("L", (w, h))
			nouvImg.putdata(egalise.getdata())
			data = array(nouvImg)
			aplat = data.flat
			condition = (aplat>=1)&(aplat<=255)
			idCond = where(condition, 255, 0)
			nouvImgBinaire = Image.new("L", (w, h))
			nouvImgBinaire.putdata(idCond.tolist())
			listeAlpha_1=list(nouvImgBinaire.getdata())
			newListRGBAbin=[]
			for parcListe in listeAlpha_1:
				if parcListe==255: newListRGBAbin.append((255, 255, 255, 0))
				else: newListRGBAbin.append((0, 0, 0, 255))
			nouvImgRGBA=Image.new("RGBA", (w, h))
			nouvImgRGBA.putdata(newListRGBAbin)
			nouvImgRGBA.save(self.repTampon+'tmp_gds568ec4u5hg53g7s9m4rt.png', 'PNG')
			spin3=float(spin3/10.0)
			imPrinc=Image.open(self.listeImgSource[0])
			imPosterize=ImageOps.posterize(imPrinc, spin2)
			imPosterize.convert('RGBA')
			imPosterize.save(self.repTampon+'tmp_gds89gfdt39xfg6d9qxx1f.png', 'PNG')
			imPostTraitC=Image.open(self.repTampon+'tmp_gds89gfdt39xfg6d9qxx1f.png')
			imContraste=ImageEnhance.Contrast(imPostTraitC)
			imContraste.enhance(spin3).save(self.repTampon+'tmp_gds486fsf68q2wx5k7u1oop.png', 'PNG')
			imOpc=Image.open(self.repTampon+'tmp_gds486fsf68q2wx5k7u1oop.png')
			imOpc.convert('RGBA')
			imFondTransp=Image.open(self.repTampon+'tmp_gds568ec4u5hg53g7s9m4rt.png')
			compoContCoul=Image.composite(imFondTransp, imOpc, imFondTransp)
			compoContCoul.save(self.cheminCourantSauv)
			os.remove(self.repTampon+'tmp_gds568ec4u5hg53g7s9m4rt.png')
			os.remove(self.repTampon+'tmp_gds89gfdt39xfg6d9qxx1f.png')
			os.remove(self.repTampon+'tmp_gds486fsf68q2wx5k7u1oop.png')
 
		elif self.listeComboReglage[i][1]=='negatif':
			"""Conversion de la 1ère image en Negatif: inverse les couleurs"""
			###################################################################
			# Les commentaires n'ont pas été gardés ici, pour savoir de quoi
			# il en retourne voir dans la fonction appliquerNegatif
			###################################################################
			indexCombo = self.listeComboReglage[i][3].combo.currentIndex()
			entreeCombo = str(self.listeComboReglage[i][3].combo.itemData(indexCombo).toStringList()[0])
			obImg = Image.open(self.listeImgSource[0])
			if entreeCombo=='negatif_couleur':
				negatif = ImageOps.invert(obImg)
			elif entreeCombo=='negatif_n_et_b':
				obImg = obImg.convert("L")
				negatif = ImageOps.invert(obImg)
			negatif.save(self.cheminCourantSauv)
 
		elif self.listeComboReglage[i][1]=='encadre_photo':
			"""Conversion de la 1ère image en Encadrement photographique"""
			###################################################################
			# Les commentaires n'ont pas été gardés ici, pour savoir de quoi
			# il en retourne voir dans la fonction appliquerEncadrePhoto
			###################################################################
			indexCombo = self.listeComboReglage[i][3].combo.currentIndex()
			entreeCombo = str(self.listeComboReglage[i][3].combo.itemData(indexCombo).toStringList()[0])
			obImg = Image.open(self.listeImgSource[0])
			if entreeCombo=='noir': couleur = (0, 0, 0)
			elif entreeCombo=='gris': couleur = (128, 128, 128)
			elif entreeCombo=='blanc': couleur = (255, 255, 255)
			elif entreeCombo=='rouge': couleur = (255, 0, 0)
			elif entreeCombo=='vert': couleur = (0, 255, 0)
			elif entreeCombo=='bleu': couleur = (0, 0, 255)
			elif entreeCombo=='jaune': couleur = (255, 255, 0)
			cadre = ImageOps.expand(obImg, 40, couleur)
			cadre.save(self.cheminCourantSauv)
 
		elif self.listeComboReglage[i][1]=='couleurs_predefinies':
			"""Conversion de la 1ère image en Couleurs Prédéfinies"""
			###################################################################
			# Les commentaires n'ont pas été gardés ici, pour savoir de quoi
			# il en retourne voir dans la fonction appliquerCouleursPredef
			###################################################################
			indexCombo = self.listeComboReglage[i][3].combo.currentIndex()
			entreeCombo = str(self.listeComboReglage[i][3].combo.itemData(indexCombo).toStringList()[0])
			if entreeCombo=="rouge_vif":
				couleur_Img_Predef=(
				1.0, 0.3, 0.0, 0,
				0.0, 0.0, 0.0, 0,
				0.0, 0.0, 0.0, 0)
			elif entreeCombo=="rouge_primaire":
				couleur_Img_Predef=(
				1.0, 0.3, 0.0, 0,
				0.0, 0.0, 0.0, 0,
				0.7, 0.0, 0.0, 0)
			elif entreeCombo=="vert_perroquet":
				couleur_Img_Predef=(
				0.0, 0.0, 0.0, 0,
				1.0, 0.3, 0.0, 0,
				0.0, 0.0, 0.0, 0)
			elif entreeCombo=="vert_acide_clair":
				couleur_Img_Predef=(
				1.0, 0.0, 0.0, 0,
				1.0, 0.3, 0.0, 0,
				0.0, 0.0, 0.0, 0)
			elif entreeCombo=="bleu_roi":
				couleur_Img_Predef=(
				0.0, 0.0, 0.0, 0,
				1.0, 0.0, 0.0, 0,
				1.0, 1.0, 0.0, 0)
			elif entreeCombo=="bleu_indigo":
				couleur_Img_Predef=(
				1.0, 0.0, 0.0, 0,
				1.0, 0.0, 0.0, 0,
				1.0, 1.0, 0.0, 0)
			elif entreeCombo=="bleu_turquoise":
				couleur_Img_Predef=(
				1.0, 0.0, 0.0, 0,
				1.0, 1.0, 0.0, 0,
				1.0, 1.0, 0.0, 0)
			elif entreeCombo=="jaune_or":
				couleur_Img_Predef=(
				0.64, 0.64, 0.10, 0,
				0.56, 0.56, 0.10, 0,
				0.0, 0.0, 0.0, 0)
			elif entreeCombo=="jaune_orange":
				couleur_Img_Predef=(
				1.0, 0.5, 0.5, 0,
				1.0, 0.3, 0.0, 0,
				0.0, 0.0, 0.0, 0)
			elif entreeCombo=="saumon":
				couleur_Img_Predef=(
				1.0, 0.5, 0.0, 0,
				1.0, 0.1, 0.0, 0,
				1.0, 0.0, 0.0, 0)
			elif entreeCombo=="marron_tres_clair":
				couleur_Img_Predef=(
				0.95, 0.38, 0.0, 0,
				0.90, 0.15, 0.0, 0,
				0.48, 0.26, 0.0, 0)
			elif entreeCombo=="terre argileuse":
				couleur_Img_Predef=(
				0.96, 0.58, 0.0, 0,
				0.56, 0.44, 0.0, 0,
				0.46, 0.32, 0.0, 0)
			elif entreeCombo=="gris_colore_rouge":
				couleur_Img_Predef=(
				0.68, 0.68, 0.0, 0,
				0.50, 0.50, 0.0, 0,
				0.50, 0.50, 0.0, 0)
			elif entreeCombo=="gris_colore_vert":
				couleur_Img_Predef=(
				0.50, 0.50, 0.0, 0,
				0.62, 0.62, 0.0, 0,
				0.50, 0.50, 0.0, 0)
			elif entreeCombo=="gris_colore_bleu":
				couleur_Img_Predef=(
				0.50, 0.50, 0.0, 0,
				0.50, 0.50, 0.0, 0,
				0.64, 0.64, 0.0, 0)
			elif entreeCombo=="gris_colore_jaune":
				couleur_Img_Predef=(
				0.62, 0.62, 0.0, 0,
				0.62, 0.62, 0.0, 0,
				0.50, 0.50, 0.0, 0)
			obImg = Image.open(self.listeImgSource[0])
			convert = obImg.convert("RGB").convert("RGB", couleur_Img_Predef)
			convert.save(self.cheminCourantSauv)
 
		elif self.listeComboReglage[i][1]=='couleurs_personnalisees':
			"""Conversion de la 1ère image en Couleurs Personnalisees"""
			listeCouleurImgPerso=[]
			for k in range(3):
				for l in range(3):
					listeCouleurImgPerso.append(float('0.'+str(self.listeComboReglage[i][3].spin[k][l].value())))
				listeCouleurImgPerso.append(0)
			print listeCouleurImgPerso
			obImg=Image.open(self.listeImgSource[0])
			convert = obImg.convert("RGB").convert("RGB", listeCouleurImgPerso)
			convert.save(self.cheminCourantSauv)
 
		elif self.listeComboReglage[i][1]=='separ_en_modules':
			"""Conversion de la 1ère image en Séparation et modules"""
			spin1 = self.listeComboReglage[i][3].spin1.value()
			spin2 = self.listeComboReglage[i][3].spin2.value()
			if spin1>=spin2:
				erreur=QMessageBox(self)
				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."))
				erreur.setWindowTitle(_(u"Erreur de réglage"))
				erreur.setIcon(QMessageBox.Warning)
				erreur.exec_()
				sys.exit
			else:
				try:
					obImg=Image.open(self.listeImgSource[0])
					width, height=obImg.size
					drawImage = ImageDraw.Draw(obImg)
					pixels = list(obImg.getdata())
					# Travail avec les pixels
					for y in range(0, height, spin1):
						yp = y * width
						for x in range(0, width, spin1):
							xyp = yp + x
							p = pixels[xyp]
							rndSize = random.randint(spin1, spin2)
							x1 = x - rndSize
							y1 = y - rndSize
							x2 = x + rndSize
							y2 = y + rndSize
							drawImage.rectangle((x1, y1, x2, y2), fill=p, outline=(0,0,0))
					obImg.save(self.cheminCourantSauv)
 
				except:
					erreur=QMessageBox(self)
					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>"))
					erreur.setWindowTitle(_(u"Erreur"))
					erreur.setIcon(QMessageBox.Critical)
					erreur.exec_()
					return 0
 
		elif self.listeComboReglage[i][1]=='omb_lum_a_la_coul':
			"""Conversion de la 1ère image en Ombre et lumière à la couleur"""
			ll=[]
			for k in range(4):
				for l in range(2):
					ll.append(self.listeComboReglage[i][3].spin[k][l].value())
			self.lValCoul=[ll[0], ll[2], ll[4], ll[6], ll[1], ll[3], ll[5], ll[7]]
			obImg=Image.open(self.listeImgSource[0])
			imageNDG = obImg.convert("L")
			wSeuil, hSeuil = imageNDG.size
			egaliseNDG_Seuil = ImageOps.equalize(imageNDG)
			nouvImgNDG_Seuil = Image.new("L", (wSeuil, hSeuil))
			nouvImgNDG_Seuil.putdata(egaliseNDG_Seuil.getdata())
			dataNDG_Seuil=array(nouvImgNDG_Seuil)
			aplatNDG_Seuil=dataNDG_Seuil.flat
			condSeuil=(aplatNDG_Seuil>=128)&(aplatNDG_Seuil<=255)
			idSeuil=where(condSeuil, 0, 255)
			transListe=idSeuil.tolist()
			quatreCanaux=[[parcTrans]*4 for parcTrans in transListe]
			transTuple=[tuple(parcTuple) for parcTuple in quatreCanaux]
			listeDonnees=[]
			for parcDonnees in transTuple:
				if parcDonnees==(255, 255, 255, 255):
					parcDonnees=(self.lValCoul[0], self.lValCoul[1], self.lValCoul[2], self.lValCoul[3])
					listeDonnees.append(parcDonnees)
				elif parcDonnees==(0, 0, 0, 0):
					parcDonnees=(self.lValCoul[4], self.lValCoul[5], self.lValCoul[6], self.lValCoul[7])
					listeDonnees.append(parcDonnees)
			nouvImg=Image.new("RGBA", (wSeuil, hSeuil))
			nouvImg.putdata(listeDonnees)
			nouvImg.save(self.cheminCourantSauv)
 
		elif self.listeComboReglage[i][1]=='rotation_image':
			# Récupération de l'index et l'entrée du combo de sélection
			indexCombo = self.listeComboReglage[i][3].combo.currentIndex()
			entreeCombo = str(self.listeComboReglage[i][3].combo.itemData(indexCombo).toStringList()[0])
			# Ouverture de l'image
			obImg = Image.open(self.listeImgSource[0])
			#
			if entreeCombo=='rot_img_90_gauche': rot = 90
			elif entreeCombo=='rot_img_180_gauche': rot = 180
			elif entreeCombo=='rot_img_270_gauche': rot = 270
			# Application du filtre
			obImg.rotate(rot).save(self.cheminCourantSauv)
 
		elif self.listeComboReglage[i][1]=='imitation_bd_2':
			###################################################################
			# Les commentaires n'ont pas été gardés ici, pour savoir de quoi
			# il en retourne voir dans la fonction appliquerImitationBd
			###################################################################
			spin1 = self.listeComboReglage[i][3].spin.value() # intensité des traits
			spin2 = str(self.listeComboReglage[i][3].spin2.value()) # flou des couleurs
 
			os.system(("convert -noise "+spin2+" -gamma 1.4 "+"\""+self.listeImgSource[0]+"\""+' '+"\""+self.repTampon+'tmp_colf84dv556tdf65gu.png'+"\"").encode(locale.getdefaultlocale()[1]))
 
			obImg = Image.open(self.listeImgSource[0]).convert("L")
			w, h = obImg.size
			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)))
			imKernel.save(self.repTampon+'tmp_tfgt6gr99yc9terff4.png', 'PNG')
			ouvImg = Image.open(self.repTampon+'tmp_tfgt6gr99yc9terff4.png')
			egalise = ImageOps.equalize(ouvImg)
			nouvImg = Image.new("L", (w, h))
			nouvImg.putdata(egalise.getdata())
			data = array(nouvImg)
			aplat = data.flat
			condition = (aplat>=1)&(aplat<=255)
			idCond = where(condition, 255, 0)
			nouvImgBinaire = Image.new("L", (w, h))
			nouvImgBinaire.putdata(idCond.tolist())
			listeAlpha_1=list(nouvImgBinaire.getdata())
			newListRGBAbin=[]
			for parcListe in listeAlpha_1:
				if parcListe==255: newListRGBAbin.append((255, 255, 255, 0))
				else: newListRGBAbin.append((0, 0, 0, 255))
			nouvImgRGBA=Image.new("RGBA", (w, h))
			nouvImgRGBA.putdata(newListRGBAbin)
			nouvImgRGBA.save(self.repTampon+'tmp_tfgt6gr99yc9terff4.png', 'PNG')
 
			imOpc=Image.open(self.repTampon+'tmp_colf84dv556tdf65gu.png')
			imOpc.convert('RGBA')
			imFondTransp=Image.open(self.repTampon+'tmp_tfgt6gr99yc9terff4.png')
			compoContCoul=Image.composite(imFondTransp, imOpc, imFondTransp)
			compoContCoul.save(self.cheminCourantSauv)
			os.remove(self.repTampon+'tmp_colf84dv556tdf65gu.png')
			os.remove(self.repTampon+'tmp_tfgt6gr99yc9terff4.png')
 
		elif self.listeComboReglage[i][1]=='laplacien_1':
			# Récupération de l'index et l'entrée du combo de sélection
			indexCombo = self.listeComboReglage[i][3].combo.currentIndex()
			entreeCombo = str(self.listeComboReglage[i][3].combo.itemData(indexCombo).toStringList()[0])
			# Ouverture de l'image avec conditions
			if entreeCombo=="laplacien_1_noir_et_blanc":
				obImg = Image.open(self.listeImgSource[0]).convert('L')
			elif entreeCombo=="laplacien_1_couleur":
				obImg = Image.open(self.listeImgSource[0]).convert('RGB')
			sizeKern5x5=(5, 5)
			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)
			imKernelLaplacien_1 = obImg.filter(ImageFilter.Kernel(sizeKern5x5, kernLaplacien_1)).save(self.cheminCourantSauv)
 
		elif self.listeComboReglage[i][1]=='contour_et_couleur':
			###################################################################
			# Les commentaires n'ont pas été gardés ici, pour savoir de quoi
			# il en retourne voir dans la fonction appliquerContourEtCouleur
			###################################################################
			# Partie trait/contour
			###################################################################
			coul_rouge_trait = self.listeComboReglage[i][3].spin[0][2].value() # rouge
			coul_vert_trait = self.listeComboReglage[i][3].spin[1][2].value() # vert
			coul_bleu_trait = self.listeComboReglage[i][3].spin[2][2].value() # bleu
			transparence_trait = self.listeComboReglage[i][3].spin[3][2].value() # transparence
			# Valeur de l'intensité du trait
			val_intens_trait = self.listeComboReglage[i][3].spin[len(self.listeComboReglage[i][3].spin)-1].value()
 
			obImg = Image.open(self.listeImgSource[0]).convert("L")
			w, h = obImg.size
			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)))
			imKernel.save(self.repTampon+'tmp_gdf5t4n158w61816qf78f5fd599q.png', 'PNG')
			ouvImg = Image.open(self.repTampon+'tmp_gdf5t4n158w61816qf78f5fd599q.png')
			egalise = ImageOps.equalize(ouvImg)
			nouvImg = Image.new("L", (w, h))
			nouvImg.putdata(egalise.getdata())
			data = array(nouvImg)
			aplat = data.flat
			condition = (aplat>=1)&(aplat<=255)
			idCond = where(condition, 255, 0)
			nouvImgBinaire = Image.new("L", (w, h))
			nouvImgBinaire.putdata(idCond.tolist())
			listeAlpha_1=list(nouvImgBinaire.getdata())
			newListRGBAbin=[]
			for parcListe in listeAlpha_1:
				if parcListe==255: newListRGBAbin.append((255, 255, 255, 0))
				else: newListRGBAbin.append((coul_rouge_trait, coul_vert_trait, coul_bleu_trait, transparence_trait))
			nouvImgRGBA=Image.new("RGBA", (w, h))
			nouvImgRGBA.putdata(newListRGBAbin)
			nouvImgRGBA.save(self.repTampon+'tmp_gdf5t4n158w61816qf78f5fd599q.png', 'PNG')
			###################################################################
			# Partie couleur (ombre et lumière)
			###################################################################
			ll=[]
			for k in range(4):
				for l in range(2):
					ll.append(self.listeComboReglage[i][3].spin[k][l].value())
			self.lValCoul=[ll[0], ll[2], ll[4], ll[6], ll[1], ll[3], ll[5], ll[7]]
			obImg=Image.open(self.listeImgSource[0])
			imageNDG = obImg.convert("L")
			wSeuil, hSeuil = imageNDG.size
			egaliseNDG_Seuil = ImageOps.equalize(imageNDG)
			nouvImgNDG_Seuil = Image.new("L", (wSeuil, hSeuil))
			nouvImgNDG_Seuil.putdata(egaliseNDG_Seuil.getdata())
			dataNDG_Seuil=array(nouvImgNDG_Seuil)
			aplatNDG_Seuil=dataNDG_Seuil.flat
			condSeuil=(aplatNDG_Seuil>=128)&(aplatNDG_Seuil<=255)
			idSeuil=where(condSeuil, 0, 255)
			transListe=idSeuil.tolist()
			quatreCanaux=[[parcTrans]*4 for parcTrans in transListe]
			transTuple=[tuple(parcTuple) for parcTuple in quatreCanaux]
			listeDonnees=[]
			for parcDonnees in transTuple:
				if parcDonnees==(255, 255, 255, 255):
					parcDonnees=(self.lValCoul[0], self.lValCoul[1], self.lValCoul[2], self.lValCoul[3])
					listeDonnees.append(parcDonnees)
				elif parcDonnees==(0, 0, 0, 0):
					parcDonnees=(self.lValCoul[4], self.lValCoul[5], self.lValCoul[6], self.lValCoul[7])
					listeDonnees.append(parcDonnees)
			nouvImg=Image.new("RGBA", (wSeuil, hSeuil))
			nouvImg.putdata(listeDonnees)
			#nouvImg.save(self.cheminCourantSauv)
			nouvImg.save(self.repTampon+'tmp_gdfg586re65fg86r68efez8erz535.png', 'PNG')
			##################################################
			# Compositing
			##################################################
			imFondTransp=Image.open(self.repTampon+'tmp_gdf5t4n158w61816qf78f5fd599q.png')
			compoContCoul=Image.composite(imFondTransp, nouvImg, imFondTransp)
			compoContCoul.save(self.cheminCourantSauv)
			os.remove(self.repTampon+'tmp_gdf5t4n158w61816qf78f5fd599q.png')
			os.remove(self.repTampon+'tmp_gdfg586re65fg86r68efez8erz535.png')
			##################################################
 
		# Affichage de l'image temporaire dans l'onglet
		# Images après traitement
		#
		# Ouverture d'une boite de dialogue affichant l'aperçu.
 
		# Affichage par le bouton Voir le résultat
		visio = VisionneurEvolue(self.cheminCourantSauv)
		visio.redimenFenetre(self.mainWindowFrameGeometry, 1., 0.7)
		visio.exec_()
 
		return 0
 
 
	def appliquer0(self):
		"""Préparation de la conversion"""
 
		self.listeImgSource=self.afficheurImgSource.getFiles()
 
		# Onglet de log
		self.zoneAffichInfosImg.setText(self.infosImgTitre[0]+"\n".join(self.listeImgSource))
 
		# Redimensionner les images de tailles différentes
		self.redim_img()
 
		# Récupération du chemin
		rep = self.base.getRepSource(self.config)
 
		# Utilisation de la nouvelle boîte de dialogue de sauvegarde
		suffix=""
		self.cheminSauv = EkdSaveDialog(self, os.path.expanduser(rep), suffix, _(u"Sauver"), multiple=True)
		self.cheminSauv = self.cheminSauv.getFile()
 
		if not self.cheminSauv: return
 
		#print 'Chemin+nom de sauvegarde:', self.cheminSauv
 
		# Condition à respecter pour qu'une redimension ait lieu
		self.conversionImg = 0
 
		# Liste des fichiers de destination
		self.listeImgDestin = []
 
		# Extension/format des images
		self.ext = os.path.splitext(self.listeImgSource[0])[1].encode("UTF8")
 
		# Liste des indices des images [0,1,2,...,nombre d'images-1]
		self.listeIndex = range(len(self.listeImgSource))
 
		# Nombre d'images sources
		self.nbrImg = len(self.listeImgSource)
 
		# Récupération de l'identifiant du codec
		self.i = self.comboReglage.currentIndex()
 
		# Indice de l'image à convertir
		self.j = 0
 
		# Drapeau (réinitialisation): terminer le filtre avec commande 100% shell
		self.terminerFiltreShell = 0
 
		self.progress.reset() # wasCanceled est remis à 0 -> la conversion ne s'arrête pas à la 1ère img
		self.progress.show()
		self.progress.setValue(0)
		QApplication.processEvents()
 
		# Faire en sorte que la boite de dialogue ait le temps de s'afficher correctement
		QTimer.singleShot(0, self.appliquer)
 
 
	def appliquer(self):
		"""Conversion des images"""
 
		# L'incrémentation de l'indice de l'image source se fait dans cette fonction si le 
		# filtre est choisi
		# contient un moteur module python, ou dans opReccurApresApp() pour 1 filtre 100% 
		# commande shell
 
		# Sauvegarde
		self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
 
		#------------------------------
		# Filtres 100% commande shell
		#------------------------------
 
		# Mise en place de conditions pour linux et windows
		# Attention dans la version windows ce n'est pas traité par un QProcess (comme sous
		# Linux) mais directement avec os.system (car le QProcess avec la commande convert
		# d'ImageMagick génère une erreur)
 
		# Sous windows process.start(...) est désactivé car cela ne fonctionne pas avec les 
		# commandes ImageMagick, os.system(...) est utilisé à la place. Changement du code pour
                # s'accorder avec os.system(...)
 
		# Le code est plus long que dans la version Linux --> la boucle a été rajoutée ds 
		# chaque choix pour les filtres dépendant d'ImageMagick.
 
		if self.listeComboReglage[self.i][1] in ['sepia','traits_noirs','peu_couleur','peinture_huile',\
					'gamma','fonce_clair','peinture_eau','bas_relief']:
 
			spin = str(self.listeComboReglage[self.i][3].spin.value())
 
			if self.listeComboReglage[self.i][1]=='sepia':
				# Uniquement pour Linux et MacOSX
				if os.name in ['posix', 'mac']:
					self.process.start("convert -sepia-tone "+spin+"% "+"\""+self.listeImgSource[self.j]+"\""+' '+"\""+self.cheminCourantSauv+"\"")
				# Uniquement pour windows
				elif os.name == 'nt':
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system("convert -sepia-tone "+spin+"% "+"\""+self.listeImgSource[self.j]+"\""+' '+"\""+self.cheminCourantSauv+"\"")
						if not self.opReccurApresApp(): return
 
			elif self.listeComboReglage[self.i][1]=='traits_noirs':
				# Uniquement pour Linux et MacOSX
				if os.name in ['posix', 'mac']:
					self.process.start("convert -charcoal "+spin+" -monochrome "+"\""+self.listeImgSource[self.j]+"\" "+"\""+self.cheminCourantSauv+"\"")
				# Uniquement pour windows
				elif os.name == 'nt':
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system("convert -charcoal "+spin+" -monochrome "+"\""+self.listeImgSource[self.j]+"\""+' '+"\""+self.cheminCourantSauv+"\"")
						if not self.opReccurApresApp(): return
 
			elif self.listeComboReglage[self.i][1]=='peu_couleur':
				# Uniquement pour Linux et MacOSX
				if os.name in ['posix', 'mac']:
					self.process.start("convert -enhance -equalize -edge "+spin+" -colorize 6,12,20 "+"\""+self.listeImgSource[self.j]+"\" "+"\""+self.cheminCourantSauv+"\"")
				# Uniquement pour windows
				elif os.name == 'nt':
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system("convert -enhance -equalize -edge "+spin+" -colorize 6,12,20 "+"\""+self.listeImgSource[self.j]+"\""+' '+"\""+self.cheminCourantSauv+"\"")
						if not self.opReccurApresApp(): return
 
			elif self.listeComboReglage[self.i][1]=='peinture_huile':
				# Uniquement pour Linux et MacOSX
				if os.name in ['posix', 'mac']:
					self.process.start("convert -paint "+spin+" \""+self.listeImgSource[self.j]+"\" "+"\""+self.cheminCourantSauv+"\"")
				# Uniquement pour windows
				elif os.name == 'nt':
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system("convert -paint "+spin+' '+"\""+self.listeImgSource[self.j]+"\""+' '+"\""+self.cheminCourantSauv+"\"")
						if not self.opReccurApresApp(): return
 
			elif self.listeComboReglage[self.i][1]=='gamma':
				# Uniquement pour Linux et MacOSX
				if os.name in ['posix', 'mac']:
					self.process.start("convert -gamma "+spin+" \""+self.listeImgSource[self.j]+"\" "+"\""+self.cheminCourantSauv+"\"")
				# Uniquement pour windows
				elif os.name == 'nt':
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system("convert -gamma "+spin+' '+"\""+self.listeImgSource[self.j]+"\""+' '+"\""+self.cheminCourantSauv+"\"")
						if not self.opReccurApresApp(): return
 
			elif self.listeComboReglage[self.i][1]=='fonce_clair':
				# Uniquement pour Linux et MacOSX
				if os.name in ['posix', 'mac']:
					self.process.start("convert -modulate "+spin+" \""+self.listeImgSource[self.j]+"\" "+"\""+self.cheminCourantSauv+"\"")
				# Uniquement pour windows
				elif os.name == 'nt':
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system("convert -modulate "+spin+" \""+self.listeImgSource[self.j]+"\""+' '+"\""+self.cheminCourantSauv+"\"")
						if not self.opReccurApresApp(): return
 
			elif self.listeComboReglage[self.i][1]=='peinture_eau':
				# Uniquement pour Linux et MacOSX
				if os.name in ['posix', 'mac']:
					self.process.start("convert -noise "+spin+" -gamma 1.4 "+"\""+self.listeImgSource[self.j]+"\" "+"\""+self.cheminCourantSauv+"\"")
				# Uniquement pour windows
				elif os.name == 'nt':
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system("convert -noise "+spin+" -gamma 1.4 "+"\""+self.listeImgSource[self.j]+"\""+' '+"\""+self.cheminCourantSauv+"\"")
						if not self.opReccurApresApp(): return
 
			elif self.listeComboReglage[self.i][1]=='bas_relief':
				# Uniquement pour Linux et MacOSX
				if os.name in ['posix', 'mac']:
					self.process.start("convert -paint "+spin+" -shade 120x45 "+"\""+self.listeImgSource[self.j]+"\" "+"\""+self.cheminCourantSauv+"\"")
				# Uniquement pour windows
				elif os.name == 'nt':
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system("convert -paint "+spin+" -shade 120x45 "+"\""+self.listeImgSource[self.j]+"\""+' '+"\""+self.cheminCourantSauv+"\"")
						if not self.opReccurApresApp(): return
 
		elif self.listeComboReglage[self.i][1] in ['crayon_papier','floutage','trait_couleur_fond_noir']:
 
			spin1 = str(self.listeComboReglage[self.i][3].spin1.value())
			spin2 = str(self.listeComboReglage[self.i][3].spin2.value())
 
			if self.listeComboReglage[self.i][1]=='crayon_papier':
				# Uniquement pour Linux et MacOSX
				if os.name in ['posix', 'mac']:
					self.process.start("convert -spread "+spin2+" -charcoal "+spin1+" \""+self.listeImgSource[self.j]+"\" "+"\""+self.cheminCourantSauv+"\"")
				# Uniquement pour windows
				elif os.name == 'nt':
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system("convert -spread "+spin2+" -charcoal "+spin1+' '+"\""+self.listeImgSource[self.j]+"\""+' '+"\""+self.cheminCourantSauv+"\"")
						if not self.opReccurApresApp(): return
 
			elif self.listeComboReglage[self.i][1]=='floutage':
				# Uniquement pour Linux et MacOSX
				if os.name in ['posix', 'mac']:
					self.process.start("convert -blur "+spin1+'%'+'x'+spin2+"% "+"\""+self.listeImgSource[self.j]+"\" "+"\""+self.cheminCourantSauv+"\"")
				# Uniquement pour windows
				elif os.name == 'nt':
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system("convert -blur "+spin1+'%'+'x'+spin2+"% "+"\""+self.listeImgSource[self.j]+"\""+' '+"\""+self.cheminCourantSauv+"\"")
						if not self.opReccurApresApp(): return
 
			elif self.listeComboReglage[self.i][1]=='trait_couleur_fond_noir':
				# Uniquement pour Linux et MacOSX
				if os.name in ['posix', 'mac']:
					self.process.start("convert -median "+spin1+" -edge "+spin2+" \""+self.listeImgSource[self.j]+"\" "+"\""+self.cheminCourantSauv+"\"")
				# Uniquement pour windows
				elif os.name == 'nt':
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system("convert -median "+spin1+" -edge "+spin2+' '+"\""+self.listeImgSource[self.j]+"\""+' '+"\""+self.cheminCourantSauv+"\"")
						if not self.opReccurApresApp(): return
 
		elif self.listeComboReglage[self.i][1]=='monochrome':
			# Uniquement pour Linux et MacOSX
			if os.name in ['posix', 'mac']:
				self.process.start("convert -monochrome "+"\""+self.listeImgSource[self.j]+"\" "+"\""+self.cheminCourantSauv+"\"")
			# Uniquement pour windows
			elif os.name == 'nt':
				for self.j in self.listeIndex:
					self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
					os.system("convert -monochrome "+"\""+self.listeImgSource[self.j]+"\""+' '+"\""+self.cheminCourantSauv+"\"")
					if not self.opReccurApresApp(): return
 
		elif self.listeComboReglage[self.i][1]=='pointillisme':
 
			indexCombo = self.listeComboReglage[self.i][3].combo.currentIndex()
			entreeCombo = str(self.listeComboReglage[self.i][3].combo.itemData(indexCombo).toStringList()[0])
 
			# Uniquement pour Linux et MacOSX
			if os.name in ['posix', 'mac']:
				self.process.start("convert +noise "+entreeCombo+" "+"\""+self.listeImgSource[self.j]+"\" "+"\""+self.cheminCourantSauv+"\"")
			# Uniquement pour windows
			elif os.name == 'nt':
				for self.j in self.listeIndex:
					self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
					os.system("convert +noise "+entreeCombo+' '+"\""+self.listeImgSource[self.j]+"\""+' '+"\""+self.cheminCourantSauv+"\"")
					if not self.opReccurApresApp(): return
 
		elif self.listeComboReglage[self.i][1]=='craie_blanche':
			# Uniquement pour Linux et MacOSX
			if os.name in ['posix', 'mac']:
				self.process.start("convert -blur 2x2 -fx 'log(r*60*pi)' -edge 0.1 -blur 2x2 "+"\""+self.listeImgSource[self.j]+"\" "+"\""+self.cheminCourantSauv+"\"")
			# Uniquement pour windows
			elif os.name == 'nt':
				for self.j in self.listeIndex:
					self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
					os.system("convert -blur 2x2 -fx 'log(r*60*pi)' -edge 0.1 -blur 2x2 "+"\""+self.listeImgSource[self.j]+"\""+' '+"\""+self.cheminCourantSauv+"\"")
					if not self.opReccurApresApp(): return
 
		#------------------------------
		# Gestion par G'MIC
		#------------------------------
 
		# Mise en place de conditions pour linux et windows
		# Attention dans la version windows ce n'est pas traité par un QProcess (comme sous
		# Linux) mais directement avec os.system (pour l'instant, test pas encore fait pour
		# savoir si ça fonctionne bien avec QProcess --> A FAIRE)
 
		# Sous windows process.start(...) est désactivé POUR L'INSTANT, os.system(...) est
		# utilisé à la place.
 
		# Le code est plus long que dans la version Linux --> la boucle a été rajoutée ds 
		# chaque choix pour les filtres dépendant de G'MIC.
 
		### ATTENTION ######################################################################
		# "\"" a été remplacé par "\\\"" car G'MIC demande une syntaxe du style: 
		# gmic \"mon nom de fichier avec espace.jpg\" ... pour pouvoir traiter des fichiers
		# avec des espaces dans son nom
		####################################################################################
 
		####################################################################################
		# Momentanément importé (bug d'affichage)
		import locale
		####################################################################################
 
 
		########Rajout le 4/02/2011 par LUCAS Thomas et CABANA Antoine##################
		if self.listeComboReglage[self.i][1] in ['dessin_13_couleur', 'crayon_papier_2', 'oeilleton', 'polaroid', 'vieille_photo', 'cubisme_analytique', 'andy_warhol', 'expressionnisme', 'correct_yeux_rouges', 'solarisation', 'bull_en_tableau', 'la_planete_1', 'vision_thermique','enflamme','predator']:
		################################################################################
 
 
			if self.listeComboReglage[self.i][1]=='dessin_13_couleur':
				#################################################
				# Pour Dessin 13: couleur:
				# ------------------------
				# spin1 --> Amplitude
				#################################################
				spin1 = self.listeComboReglage[self.i][3].spin1.value()
				spin1 = str(spin1/100)
				# Uniquement pour Linux et MacOSX
				if os.name in ['posix', 'mac']:
					###############################################################################
					## On passe par ce traitement sous Linux et MacOSX car pour l'instant il y a ##
					### un bug d'affichage (à la fin du rendu et dans l'onglet Images après      ##
					### traitement).                                                             ##
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -drawing "+spin1+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
						if not self.opReccurApresApp(): return
					###############################################################################
					# Momentanément désactivé le temps de trouver une solution au bug d'affichage
					#self.process.start("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -drawing "+spin1+" -o "+"\\\""+self.cheminCourantSauv+"\\\"")
				# Uniquement pour windows
				elif os.name == 'nt':
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -drawing "+spin1+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
						if not self.opReccurApresApp(): return
 
			if self.listeComboReglage[self.i][1]=='crayon_papier_2':
				#################################################
				# Pour Dessin 14: crayon à papier 2:
				# ----------------------------------
				# spin1 --> Amplitude
				#################################################
				spin1 = self.listeComboReglage[self.i][3].spin1.value()
				spin1 = str(spin1/10)
				# Uniquement pour Linux et MacOSX
				if os.name in ['posix', 'mac']:
					###############################################################################
					## On passe par ce traitement sous Linux et MacOSX car pour l'instant il y a ##
					### un bug d'affichage (à la fin du rendu et dans l'onglet Images après      ##
					### traitement).                                                             ##
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -pencilbw "+spin1+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
						if not self.opReccurApresApp(): return
					###############################################################################
					# Momentanément désactivé le temps de trouver une solution au bug d'affichage
					#self.process.start("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -pencilbw "+spin1+" -o "+"\\\""+self.cheminCourantSauv+"\\\"")
				# Uniquement pour windows
				elif os.name == 'nt':
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -pencilbw "+spin1+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
						if not self.opReccurApresApp(): return
 
			if self.listeComboReglage[self.i][1]=='correct_yeux_rouges':
				# Il faut passer par if au lieu de elif ici pour que cela fonctionne bien
				#elif self.listeComboReglage[self.i][1]=='correct_yeux_rouges':
				#################################################
				# Pour Correction des yeux rouges:
				# --------------------------------
				# spin1 --> Seuil des couleurs
				# spin2 --> Lissage
				# spin3 --> Atténuation
				#################################################
				spin1 = self.listeComboReglage[self.i][3].spin1.value()
				# Si spin1 réglé sur 1 en fait spin vaut 0
				if spin1 == 1: spin1 = 0
				# Si la valeur de spin1 est supérieure à 1 on retranche 1
				if spin1 > 1: spin1 = spin1 - 1
				spin1 = str(spin1)
				spin2 = self.listeComboReglage[self.i][3].spin2.value()
				spin2 = str(spin2/10.0)
				spin3 = self.listeComboReglage[self.i][3].spin3.value()
				spin3 = str(spin3/10.0)
				# Uniquement pour Linux et MacOSX
				if os.name in ['posix', 'mac']:
					###############################################################################
					## On passe par ce traitement sous Linux et MacOSX car pour l'instant il y a ##
					### un bug d'affichage (à la fin du rendu et dans l'onglet Images après      ##
					### traitement).                                                             ##
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -red_eye "+spin1+','+spin2+','+spin3+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
						if not self.opReccurApresApp(): return
					###############################################################################
					# Momentanément désactivé le temps de trouver une solution au bug d'affichage
					#self.process.start("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -red_eye "+spin1+','+spin2+','+spin3+" -o "+"\\\""+self.cheminCourantSauv+"\\\"")
				# Uniquement pour windows
				elif os.name == 'nt':
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -red_eye "+spin1+','+spin2+','+spin3+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
						if not self.opReccurApresApp(): return
 
			if self.listeComboReglage[self.i][1]=='solarisation':
				# Il faut passer par if au lieu de elif ici pour que cela fonctionne bien
				#elif self.listeComboReglage[self.i][1]=='solarisation':
				# Uniquement pour Linux et MacOSX
				if os.name in ['posix', 'mac']:
					###############################################################################
					## On passe par ce traitement sous Linux et MacOSX car pour l'instant il y a ##
					### un bug d'affichage (à la fin du rendu et dans l'onglet Images après      ##
					### traitement).                                                             ##
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -solarize -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
						if not self.opReccurApresApp(): return
					###############################################################################
					# Momentanément désactivé le temps de trouver une solution au bug d'affichage
					#self.process.start("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -solarize -o "+"\\\""+self.cheminCourantSauv+"\\\"")
				# Uniquement pour windows
				elif os.name == 'nt':
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -solarize -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
						if not self.opReccurApresApp(): return
 
			if self.listeComboReglage[self.i][1]=='oeilleton':
				#################################################
				# Pour Oeilleton:
				# ---------------
				# spin1 --> Position sur la largeur
				# spin2 --> Position sur la hauteur
				# spin3 --> Rayon
				# spin4 --> Amplitude
				#################################################
				spin1 = str(self.listeComboReglage[self.i][3].spin1.value())
				spin2 = str(self.listeComboReglage[self.i][3].spin2.value())
				spin3 = str(self.listeComboReglage[self.i][3].spin3.value())
				spin4 = str(self.listeComboReglage[self.i][3].spin4.value())
				# Uniquement pour Linux et MacOSX
				if os.name in ['posix', 'mac']:
					###############################################################################
					## On passe par ce traitement sous Linux et MacOSX car pour l'instant il y a ##
					### un bug d'affichage (à la fin du rendu et dans l'onglet Images après      ##
					### traitement).                                                             ##
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -fish_eye "+spin1+','+spin2+','+spin3+','+spin4+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
						if not self.opReccurApresApp(): return
					###############################################################################
					# Momentanément désactivé le temps de trouver une solution au bug d'affichage
					#self.process.start("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -fish_eye "+spin1+','+spin2+','+spin3+','+spin4+" -o "+"\\\""+self.cheminCourantSauv+"\\\"")
				# Uniquement pour windows
				elif os.name == 'nt':
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -fish_eye "+spin1+','+spin2+','+spin3+','+spin4+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
						if not self.opReccurApresApp(): return
 
			if self.listeComboReglage[self.i][1]=='polaroid':
				#################################################
				# Pour Polaroïd:
				# --------------
				# spin1 --> Taille de la bordure
				# spin2 --> Taille en largeur pour l'ombre
				# spin3 --> Taille en hauteur pour l'ombre
				# spin4 --> Rotation (en degrés) de  la photo
				#################################################
				spin1 = str(self.listeComboReglage[self.i][3].spin1.value())
				spin2 = str(self.listeComboReglage[self.i][3].spin2.value())
				spin3 = str(self.listeComboReglage[self.i][3].spin3.value())
				spin4 = str(self.listeComboReglage[self.i][3].spin4.value())
				# Uniquement pour Linux et MacOSX
				if os.name in ['posix', 'mac']:
					###############################################################################
					## On passe par ce traitement sous Linux et MacOSX car pour l'instant il y a ##
					### un bug d'affichage (à la fin du rendu et dans l'onglet Images après      ##
					### traitement).                                                             ##
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -polaroid "+spin1+" -drop_shadow "+spin2+','+spin3+" -rotate "+spin4+",1 -drgba -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
						if not self.opReccurApresApp(): return
					###############################################################################
					# Momentanément désactivé le temps de trouver une solution au bug d'affichage
					#self.process.start("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -polaroid "+spin1+" -drop_shadow "+spin2+','+spin3+" -rotate "+spin4+",1 -drgba -o "+"\\\""+self.cheminCourantSauv+"\\\"")
				# Uniquement pour windows
				elif os.name == 'nt':
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -polaroid "+spin1+" -drop_shadow "+spin2+','+spin3+" -rotate "+spin4+",1 -drgba -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
						if not self.opReccurApresApp(): return
 
			if self.listeComboReglage[self.i][1]=='vieille_photo':
				#################################################
				# Pour Vieille photo:
				# -------------------
				# spin1 --> Taille en largeur pour l'ombre
				# spin2 --> Taille en hauteur pour l'ombre
				# spin3 --> Rotation (en degrés) de  la photo
				#################################################
				spin1 = str(self.listeComboReglage[self.i][3].spin1.value())
				spin2 = str(self.listeComboReglage[self.i][3].spin2.value())
				spin3 = str(self.listeComboReglage[self.i][3].spin3.value())
				# Uniquement pour Linux et MacOSX
				if os.name in ['posix', 'mac']:
					###############################################################################
					## On passe par ce traitement sous Linux et MacOSX car pour l'instant il y a ##
					### un bug d'affichage (à la fin du rendu et dans l'onglet Images après      ##
					### traitement).                                                             ##
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -old_photo -drop_shadow "+spin1+','+spin2+" -rotate "+spin3+",1 -drgba -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
						if not self.opReccurApresApp(): return
					###############################################################################
					# Momentanément désactivé le temps de trouver une solution au bug d'affichage
					#self.process.start("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -old_photo -drop_shadow "+spin1+','+spin2+" -rotate "+spin3+",1 -drgba -o "+"\\\""+self.cheminCourantSauv+"\\\"")
				# Uniquement pour windows
				elif os.name == 'nt':
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -old_photo -drop_shadow "+spin1+','+spin2+" -rotate "+spin3+",1 -drgba -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
 
			if self.listeComboReglage[self.i][1]=='cubisme_analytique':
				#################################################
				# Pour Cubisme analytique:
				# ------------------------
				# spin1 --> Itération
				# spin2 --> Taille de bloc
				# spin3 --> Angle
				#################################################
				spin1 = str(self.listeComboReglage[self.i][3].spin1.value())
				spin2 = str(self.listeComboReglage[self.i][3].spin2.value())
				spin3 = str(self.listeComboReglage[self.i][3].spin3.value())
				# Uniquement pour Linux et MacOSX
				if os.name in ['posix', 'mac']:
					###############################################################################
					## On passe par ce traitement sous Linux et MacOSX car pour l'instant il y a ##
					### un bug d'affichage (à la fin du rendu et dans l'onglet Images après      ##
					### traitement).                                                             ##
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						#self.process = EkdProcess(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -cubism "+spin1+','+spin2+','+spin3+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]), output = None, stdinput = None)
						os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -cubism "+spin1+','+spin2+','+spin3+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
						if not self.opReccurApresApp(): return
					###############################################################################
					# Momentanément désactivé le temps de trouver une solution au bug d'affichage
					#self.process.start("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -cubism "+spin1+','+spin2+','+spin3+" -o "+"\\\""+self.cheminCourantSauv+"\\\"")
				# Uniquement pour windows
				elif os.name == 'nt':
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -cubism "+spin1+','+spin2+','+spin3+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
						if not self.opReccurApresApp(): return
 
			if self.listeComboReglage[self.i][1]=='andy_warhol':
				# Il faut passer par if au lieu de elif ici pour que cela fonctionne bien
				#elif self.listeComboReglage[self.i][1]=='andy_warhol':
				#################################################
				# Pour Andy Warhol:
				# -----------------
				# spin1 --> Nombre d'images par ligne
				# spin2 --> Nombre d'images par colonne
				# spin3 --> Lissage
				# spin4 --> Couleur
				#################################################
				spin1 = str(self.listeComboReglage[self.i][3].spin1.value())
				spin2 = str(self.listeComboReglage[self.i][3].spin2.value())
				spin3 = str(self.listeComboReglage[self.i][3].spin3.value())
				spin4 = str(self.listeComboReglage[self.i][3].spin4.value())
				# Uniquement pour Linux et MacOSX
				if os.name in ['posix', 'mac']:
					###############################################################################
					## On passe par ce traitement sous Linux et MacOSX car pour l'instant il y a ##
					### un bug d'affichage (à la fin du rendu et dans l'onglet Images après      ##
					### traitement).                                                             ##
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -warhol "+spin1+','+spin2+','+spin3+','+spin4+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
						if not self.opReccurApresApp(): return
					###############################################################################
					# Momentanément désactivé le temps de trouver une solution au bug d'affichage
					#self.process.start("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -warhol "+spin1+','+spin2+','+spin3+','+spin4+" -o "+"\\\""+self.cheminCourantSauv+"\\\"")
				# Uniquement pour windows
				elif os.name == 'nt':
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -warhol "+spin1+','+spin2+','+spin3+','+spin4+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
						if not self.opReccurApresApp(): return
 
			if self.listeComboReglage[self.i][1]=='expressionnisme':
				# Il faut passer par if au lieu de elif ici pour que cela fonctionne bien
				#elif self.listeComboReglage[self.i][1]=='expressionnisme':
				#################################################
				# Pour Expressionnisme:
				# ---------------------
				# spin1 --> Abstraction
				# spin2 --> Lissage
				# spin3 --> Couleur
				#################################################
				spin1 = str(self.listeComboReglage[self.i][3].spin1.value())
				spin2 = self.listeComboReglage[self.i][3].spin2.value()
				spin2 = str(spin2/100)
				spin3 = self.listeComboReglage[self.i][3].spin3.value()
				spin3 = str(spin3/100)
				# Uniquement pour Linux et MacOSX
				if os.name in ['posix', 'mac']:
					###############################################################################
					## On passe par ce traitement sous Linux et MacOSX car pour l'instant il y a ##
					### un bug d'affichage (à la fin du rendu et dans l'onglet Images après      ##
					### traitement).                                                             ##
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -gimp_painting "+spin1+','+spin2+','+spin3+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
						if not self.opReccurApresApp(): return
					###############################################################################
					# Momentanément désactivé le temps de trouver une solution au bug d'affichage
					#self.process.start("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -gimp_painting "+spin1+','+spin2+','+spin3+" -o "+"\\\""+self.cheminCourantSauv+"\\\"")
				# Uniquement pour windows
				elif os.name == 'nt':
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -gimp_painting "+spin1+','+spin2+','+spin3+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
						if not self.opReccurApresApp(): return
 
			if self.listeComboReglage[self.i][1]=='bull_en_tableau':
				# Il faut passer par if au lieu de elif ici pour que cela fonctionne bien
				#elif self.listeComboReglage[self.i][1]=='bull_en_tableau':
				#################################################
				# Pour Bulles en tableau:
				# -----------------------
				# spin1 --> Résolution en X
				# spin2 --> Résolution en Y
				# spin3 --> Rayon de la bulle
				# spin4 --> Bulles par ligne
				# spin5 --> Bulles par colonne
				# spin6 --> Largeur de la bordure
				# spin7 --> Hauteur de la bordure
				# spin8 --> Largeur finale de l'image
				# spin9 --> Hauteur finale de l'image
				#################################################
				spin1 = str(self.listeComboReglage[self.i][3].spin1.value())
				spin2 = str(self.listeComboReglage[self.i][3].spin2.value())
				spin3 = str(self.listeComboReglage[self.i][3].spin3.value())
				spin4 = str(self.listeComboReglage[self.i][3].spin4.value())
				spin5 = str(self.listeComboReglage[self.i][3].spin5.value())
				spin6 = str(self.listeComboReglage[self.i][3].spin6.value())
				spin7 = str(self.listeComboReglage[self.i][3].spin7.value())
				spin8 = str(self.listeComboReglage[self.i][3].spin8.value())
				spin9 = str(self.listeComboReglage[self.i][3].spin9.value())
				# Uniquement pour Linux et MacOSX
				if os.name in ['posix', 'mac']:
					###############################################################################
					## On passe par ce traitement sous Linux et MacOSX car pour l'instant il y a ##
					### un bug d'affichage (à la fin du rendu et dans l'onglet Images après      ##
					### traitement).                                                             ##
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						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]))
						if not self.opReccurApresApp(): return
					###############################################################################
					# Momentanément désactivé le temps de trouver une solution au bug d'affichage
					#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+"\\\"")
				# Uniquement pour windows
				elif os.name == 'nt':
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						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]))
						if not self.opReccurApresApp(): return
 
			elif self.listeComboReglage[self.i][1]=='la_planete_1':
				#################################################
				# Pour Bulles en tableau:
				# -----------------------
				# spin1 --> Position des doubles
				# spin2 --> Rayon de la planète
				# spin3 --> Dilatation
				# spin4 --> Largeur finale de l'image
				# spin5 --> Hauteur finale de l'image
				#################################################
				spin1 = str(self.listeComboReglage[self.i][3].spin1.value())
				spin2 = str(self.listeComboReglage[self.i][3].spin2.value())
				spin3 = self.listeComboReglage[self.i][3].spin3.value()
				spin3 = str(spin3/100.0)
				spin4 = str(self.listeComboReglage[self.i][3].spin4.value())
				spin5 = str(self.listeComboReglage[self.i][3].spin5.value())
				# Uniquement pour Linux et MacOSX
				if os.name in ['posix', 'mac']:
					###############################################################################
					## On passe par ce traitement sous Linux et MacOSX car pour l'instant il y a ##
					### un bug d'affichage (à la fin du rendu et dans l'onglet Images après      ##
					### traitement).                                                             ##
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						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]))
						if not self.opReccurApresApp(): return
					###############################################################################
					# Momentanément désactivé le temps de trouver une solution au bug d'affichage
					#self.process.start("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -repeat "+spin1+ " --mirror x -a x -done -map_sphere "+spin4+','+spin5+','+spin2+','+spin3+" -o "+"\\\""+self.cheminCourantSauv+"\\\"")
				# Uniquement pour windows
				elif os.name == 'nt':
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						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]))
						if not self.opReccurApresApp(): return
 
			########Rajout le 28/11/2010 par LUCAS Thomas et CABANA Antoine###################################
			elif self.listeComboReglage[self.i][1]=='vision_thermique':
				#################################################
				# Pour Vision Thermique :
				# -----------------------
				# spin1 --> Minimum de Luminance
				# spin2 --> Maximum de Luminance
				#################################################
				spin1 = str(self.listeComboReglage[self.i][3].spin1.value())
				spin2 = str(self.listeComboReglage[self.i][3].spin2.value())
				'''
				if spin1>=spin2:
					erreur=QMessageBox(self)
					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."))
					erreur.setWindowTitle(_(u"Erreur de réglage"))
					erreur.setIcon(QMessageBox.Warning)
					erreur.exec_()
					sys.exit
				else :	
					#spin1 = str(self.listeComboReglage[self.i][3].spin1.value()) # Ce réglage est déjà définis plus haut ds le code
					#spin2 = str(self.listeComboReglage[self.i][3].spin2.value()) # Ce réglage est déjà définis plus haut ds le code
				'''
				# Uniquement pour Linux et MacOSX
				if os.name in ['posix', 'mac']:
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -luminance -n "+spin1+','+spin2+ " -negative -map 1 -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
						if not self.opReccurApresApp(): return		
 
				# Uniquement pour windows
				elif os.name == 'nt':
					for self.j in self.listeIndex :
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system(("gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -luminance -n "+spin1+','+spin2+" -negative -map 1 -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
						if not self.opReccurApresApp(): return
					##########################################################################################
				########Rajout le 4/02/2011 par LUCAS Thomas et CABANA Antoine##################
			elif self.listeComboReglage[self.i][1]=='enflamme':
				#################################################
				# Pour Enflamme :
				# -----------------------
				# spin1 --> Palette
				# spin2 --> Amplitude
				# spin3 --> Echantillonnage
				# spin4 --> Lissage
				# spin5 --> Opacité
				# spin6 --> Bord
				# spin7 --> Amplitude du lissage anisotropique
				# spin8 --> Netteté
				# spin9 --> Anisotropie
				# spin10 --> Gradiant de lissage
				# spin11 --> Tenseur de lissage
				# spin12 --> Précision spaciale
				# spin13 --> Précision angulaire
				# spin14 --> Valeur de la précision
				# spin15 --> Iterations
				#################################################
 
 
				spin1 = str(self.listeComboReglage[self.i][3].spin1.value()-1)
				spin2 = str(self.listeComboReglage[self.i][3].spin2.value())
				spin3 = str(self.listeComboReglage[self.i][3].spin3.value()/100.0)
				spin4 = str(self.listeComboReglage[self.i][3].spin4.value()/100.0)
				spin5 = str(self.listeComboReglage[self.i][3].spin5.value()/100.0)
				spin6 = str(self.listeComboReglage[self.i][3].spin6.value())
				spin7 = str(self.listeComboReglage[self.i][3].spin7.value())
				spin8 = str(self.listeComboReglage[self.i][3].spin8.value()/100.0)
				spin9 = str(self.listeComboReglage[self.i][3].spin9.value()/100.0)
				spin10 = str(self.listeComboReglage[self.i][3].spin10.value()/100.0)
				spin11 = str(self.listeComboReglage[self.i][3].spin11.value()/100.0)
				spin12 = str(self.listeComboReglage[self.i][3].spin12.value()/100.0)
				spin13 = str(self.listeComboReglage[self.i][3].spin13.value())
				spin14 = str(self.listeComboReglage[self.i][3].spin14.value()/100.0)
				spin15 = str(self.listeComboReglage[self.i][3].spin15.value())
 
				# Uniquement pour Linux et MacOSX
				if os.name in ['posix', 'mac']:
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system(("gmic "+" -m fire2.gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -fire "+spin1+','+spin2+','+spin3+','+spin4+','+spin5+','+spin6+','
					  	+spin7+','+spin8+','+spin9+','+spin10+','+spin11+','+spin12+','+spin13
					  	+','+spin14+','+spin15+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
					if not self.opReccurApresApp(): return		
 
				# Uniquement pour windows
				elif os.name == 'nt':
					for self.j in self.listeIndex :
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system(("gmic "+" -m fire2.gmic "+"\\\""+self.listeImgSource[self.j]+"\\\""+" -fire "+spin1+','+spin2+','+spin3+','+spin4+','+spin5+','+spin6+','
										   	+spin7+','+spin8+','+spin9+','+spin10+','+spin11+','+spin12+','+spin13
					   +','+spin14+','+spin15+" -o "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
						if not self.opReccurApresApp(): return
 
			#################################################################################
 
			########Rajout le 7/04/2011 par LUCAS Thomas et CABANA Antoine###################################
			elif self.listeComboReglage[self.i][1]=='predator':
				#################################################
				# Pour Vision Predator :
				# -----------------------
				#################################################
 
				filename=str(self.listeComboReglage[self.i][3].filename)
				# Uniquement pour Linux et MacOSX
				if os.name in ['posix', 'mac']:
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system(("gmic "+"\\\""+self.listeImgSource[0]+"\\\" "+filename+" -sub[1] [0] -n[1] 0,255 -sub[1] 50% -cut[1] 0,255  -negative[1] -light_relief[1] 0.3,0.001,0.1,0,0.2,0.5,0.5,1,1 -luminance[1] -add[0] [1] -remove[1] -n 0,255 -o[-1] "
 
					        +"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
						if not self.opReccurApresApp(): return		
 
				# Uniquement pour windows
				elif os.name == 'nt':
					for self.j in self.listeIndex :
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						os.system(("gmic "+"\\\""+self.listeImgSource[0]+"\\\""+filename+
					   "--sub[1] [0] --n[-1] 0,255 -sub[-1] 50% -cut[-1] 0,255 --negative[-1] --light_relief 0.3,0.001,0.1,0,0.2,0.5,0.5,1,1 -luminance[-1] --add[0] [-1] -o[-1] "+"\\\""+self.cheminCourantSauv+"\\\"").encode(locale.getdefaultlocale()[1]))
						if not self.opReccurApresApp(): return
					##########################################################################################
		#--------------------------------------------------------
		# Filtres utilisant notamment un module python (ex. PIL)
		#--------------------------------------------------------
 
		elif self.listeComboReglage[self.i][1]=='vieux_films':
			self.appliquerVieuxFilms()
 
		elif self.listeComboReglage[self.i][1]=='illustration_niveau_gris':
			for self.j in self.listeIndex:
				# Sauvegarde
				self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
				obImg = Image.open(self.listeImgSource[self.j])
				convert = obImg.convert("1")
				convert.save(self.cheminCourantSauv)
				if not self.opReccurApresApp(): return
 
		elif self.listeComboReglage[self.i][1]=='traits_fins&couleur':
			for self.j in self.listeIndex:
				# Sauvegarde
				self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
				obImg = Image.open(self.listeImgSource[self.j])
				convert = obImg.filter(ImageFilter.EDGE_ENHANCE_MORE)
				convert.save(self.cheminCourantSauv)
				if not self.opReccurApresApp(): return
 
		elif self.listeComboReglage[self.i][1]=='emboss':
			for self.j in self.listeIndex:
				# Sauvegarde
				self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
				obImg = Image.open(self.listeImgSource[self.j])
				convert = obImg.filter(ImageFilter.EMBOSS)
				convert.save(self.cheminCourantSauv)
				if not self.opReccurApresApp(): return
 
		elif self.listeComboReglage[self.i][1]=='sharpen':
				# Sauvegarde
				self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
				obImg = Image.open(self.listeImgSource[self.j])
				convert = obImg.filter(ImageFilter.SHARPEN)
				convert.save(self.cheminCourantSauv)
				if not self.opReccurApresApp(): return
 
		elif self.listeComboReglage[self.i][1]=='niveau_gris':
			for self.j in self.listeIndex:
				# Sauvegarde
				self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
				obImg = Image.open(self.listeImgSource[self.j])
				convert = obImg.convert("L")
				convert.save(self.cheminCourantSauv)
				if not self.opReccurApresApp(): return
 
		elif self.listeComboReglage[self.i][1]=='amelior_des_bords':
			for self.j in self.listeIndex:
				# Sauvegarde
				self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
				obImg = Image.open(self.listeImgSource[self.j])
				# Application de la matrice d'amélioration des bords. Matrice trouvee ici :
				# http://blogs.codes-sources.com/tkfe/archive/2005/04/15/6004.aspx
				convert = obImg.filter(ImageFilter.Kernel((3, 3), (-1, -2, -1, -2, 16, -2, -1, -2, -1)))
				convert.save(self.cheminCourantSauv)
				if not self.opReccurApresApp(): return
 
		elif self.listeComboReglage[self.i][1]=='debruitage':
			for self.j in self.listeIndex:
				# Sauvegarde
				self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
				obImg = Image.open(self.listeImgSource[self.j])
				# Application de la matrice de débruitage. Attention !!! ne fonctionne pas
				# avec les images GIF (.gif)
				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)))
				convert.save(self.cheminCourantSauv)
				if not self.opReccurApresApp(): return
 
		elif self.listeComboReglage[self.i][1]=='evanescence':
			self.appliquerEvanescence()
 
		elif self.listeComboReglage[self.i][1]=='seuillage':
			self.appliquerSeuillage()
 
		elif self.listeComboReglage[self.i][1]=='imitation_bd_1':
			self.appliquerImitationBd_1()
 
		elif self.listeComboReglage[self.i][1]=='negatif':
			self.appliquerNegatif()
 
		elif self.listeComboReglage[self.i][1]=='encadre_photo':
			self.appliquerEncadrePhoto()
 
		elif self.listeComboReglage[self.i][1]=='couleurs_predefinies':
			self.appliquerCouleursPredef()
 
		elif self.listeComboReglage[self.i][1]=='couleurs_personnalisees':
			listeCouleurImgPerso=[]
			for k in range(3):
				for l in range(3):
					listeCouleurImgPerso.append(float('0.'+str(self.listeComboReglage[self.i][3].spin[k][l].value())))
				listeCouleurImgPerso.append(0)
 
			print listeCouleurImgPerso
 
			for self.j in self.listeIndex:
				# Sauvegarde
				self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
				obImg=Image.open(self.listeImgSource[self.j])
				convert = obImg.convert("RGB").convert("RGB", listeCouleurImgPerso)
				convert.save(self.cheminCourantSauv)
				if not self.opReccurApresApp(): return
 
		# Ceci a ete réalisé à partir de: http://www.yourmachines.org/tutorials/mgpy.html
		# et à partir du script example2c.py contenu dans l'archive mgpy.tgz. mgpy
		# ('Motion Graphics in Python' (mgpy)) a été realisé par Simon Yuill en 2006.
		# Une partie du code de example2c.py a été repris ici (avec quelques transformations)
		elif self.listeComboReglage[self.i][1]=='separ_en_modules':
			# Valeurs de taille mini et maxi de la forme
			spin1 = self.listeComboReglage[self.i][3].spin1.value()
			spin2 = self.listeComboReglage[self.i][3].spin2.value()
			# La taille minimum ne doit jamais etre superieure a la taille maximum
			if spin1>=spin2:
				erreur=QMessageBox(self)
				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."))
				erreur.setWindowTitle(_(u"Erreur de réglage"))
				erreur.setIcon(QMessageBox.Warning)
				erreur.exec_()
				sys.exit
			else:
				try:
					# Boucle principale
					for self.j in self.listeIndex:
						self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+self.spin1valNombres.value()), self.spin2valNombres.value())+self.ext
						# Ouverture des images
						obImg=Image.open(self.listeImgSource[self.j])
						'''
						############### ERREUR ! ##################################################################
						if obImg.mode=='L':
							erreur=QMessageBox(self)
							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])))
							erreur.setWindowTitle(_(u"Erreur"))
							erreur.setIcon(QMessageBox.Warning)
							erreur.exec_()
							sys.exit
							return 0
						###########################################################################################
						'''
						# Taille des images
						width, height=obImg.size
						# Creation de la surface de l'image
						drawImage = ImageDraw.Draw(obImg)
						# Collecte des donnees (pixels)
						pixels = list(obImg.getdata())
						# Travail avec les pixels
						for y in range(0, height, spin1):
							yp = y * width
							for x in range(0, width, spin1):
								xyp = yp + x
								p = pixels[xyp]
								rndSize = random.randint(spin1, spin2)
								x1 = x - rndSize
								y1 = y - rndSize
								x2 = x + rndSize
								y2 = y + rndSize
								drawImage.rectangle((x1, y1, x2, y2), fill=p, outline=(0,0,0))
						obImg.save(self.cheminCourantSauv)
						if not self.opReccurApresApp(): return
 
				except:
					erreur=QMessageBox(self)
					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])))
					erreur.setWindowTitle(_(u"Erreur"))
					erreur.setIcon(QMessageBox.Critical)
					erreur.exec_()
					sys.exit
					return 0
 
		elif self.listeComboReglage[self.i][1]=='omb_lum_a_la_coul':
			self.appliquerOmbreEtLumALaCouleur()
 
		elif self.listeComboReglage[self.i][1]=='rotation_image':
			self.appliquerRotationImage()
 
		elif self.listeComboReglage[self.i][1]=='imitation_bd_2':
			self.appliquerImitationBd_2()
 
		elif self.listeComboReglage[self.i][1]=='laplacien_1':
			self.appliquerLaplacien_1()
 
		elif self.listeComboReglage[self.i][1]=='contour_et_couleur':
			self.appliquerContourEtCouleur()
 
		'''
		elif self.listeComboReglage[self.i][1]=='ombre_lumiere':
			for self.j in self.listeIndex:
				self.cheminCourantSauv = self.cheminSauv+'_'+string.zfill((self.j+1), 6)+self.ext
				process = QProcess(self)
				process.start("convert -fx 'cos(3.22*pi*R)*100' "+"\""+self.listeImgSource[self.j]+"\" "+self.repTampon+"vf_ombre_lumiere")
				if not process.waitForStarted(3000):
					QMessageBox.warning(None, _(u"Erreur"), _(u"Bogue au lancement de la commande"))
				process.waitForFinished(-1)
				obImg = Image.open(self.repTampon+"vf_ombre_lumiere")
				convert = obImg.filter(ImageFilter.SMOOTH_MORE)
				convert.save(self.cheminCourantSauv)
				if not self.opReccurApresApp(): return
		'''
 
 
	def afficherAide(self):
		"""Boîte de dialogue de l'aide"""
		messageAide=EkdAide(parent=self)
		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>"))
		messageAide.show()
 
 
	def save(self) :
		self.afficheurImgSource.saveFileLocation(self.idSection)
		EkdConfig.set(self.idSection, u'choixFiltre', unicode(self.comboReglage.currentIndex()))
		EkdConfig.set(self.idSection, u'spin1', unicode(self.spin1valNombres.value()))
		EkdConfig.set(self.idSection, u'spin2', unicode(self.spin2valNombres.value()))
 
 
	def load(self) :
		self.afficheurImgSource.loadFileLocation(self.idSection)
		self.comboReglage.setCurrentIndex(int(EkdConfig.get(self.idSection, 'choixFiltre')))
		self.spin1valNombres.setValue(int(EkdConfig.get(self.idSection, 'spin1')))
		self.spin2valNombres.setValue(int(EkdConfig.get(self.idSection, 'spin2')))