示例#1
0
	def visu_1ere_derniere_img(self):
		"""Visionnement du compositing avant application"""
		
		# Si l'utilisateur charge des images de taille différente, fait le traitement 
		# ...,  recharge de nouvelles images, il faut que les répertoires de redimen-
		# sionnement soient vidés
		
		listePresRedim_1=glob.glob(self.repTampon+'redim_1'+os.sep+'*.*')
		listePresRedim_1.sort()
		if len(listePresRedim_1)>0:
			for parcR_1 in listePresRedim_1: os.remove(parcR_1)
			
		listePresRedim_2=glob.glob(self.repTampon+'redim_2'+os.sep+'*.*')
		listePresRedim_2.sort()
		if len(listePresRedim_2)>0:
			for parcR_2 in listePresRedim_2: os.remove(parcR_2)
		

		# Récupération de la liste des fichiers chargés (avec canal alpha)
		self.listeChemAVcanAlph=self.afficheurImgSourceAvecCanalAlpha.getFiles()
		self.listeChemAVcanAlph.sort()
		
		# Récupération de la liste des fichiers chargés (sans canal alpha)
		self.listeChemSANScanAlph=self.afficheurImgSourceSansCanalAlpha.getFiles()
		self.listeChemSANScanAlph.sort()
		
		
		# Vérification du fait que les fichiers avec canal alpha chargés contiennent bien
		# un canal alpha (RGBA) ... sinon affichage d'une boîte de dialogue d'erreur et arrêt
		# du traitement des images
		for parcMode in self.listeChemAVcanAlph:
			imVerifCanAlph=Image.open(parcMode)
			if imVerifCanAlph.mode!='RGBA':
				messErr=QMessageBox(self)
				messErr.setText(_(u"<b>Vous avez chargé des images sans canal alpha</b> (c'est à dire sans transparence) et ce à partir de l'onglet <b>Image(s) avec canal alpha</b>. Sans transparence, vous ne pouvez, en aucun cas, appliquer un compositing (vos images doivent être en mode RGBA pour que cela réussisse) !."))
				messErr.setWindowTitle(_(u"Erreur"))
				messErr.setIcon(QMessageBox.Critical)
				messErr.exec_()
				return


		# ----- TRAVAIL PREPARATOIRE --- Redimensionnement des images -----------------
		try:
			
			nbreElem_1=len(self.listeChemAVcanAlph)
			nbreElem_2=len(self.listeChemSANScanAlph)
			# Appel des fonction de redimensionnement
			self.redim_img_1()
			self.redim_img_2()
			# Récup des listes contenant les fichiers
			repRedimTemp_1=glob.glob(self.repTampon+'redim_1'+os.sep+'*.*')
			repRedimTemp_1.sort()
			repRedimTemp_2=glob.glob(self.repTampon+'redim_2'+os.sep+'*.*')
			repRedimTemp_2.sort()
	
		except:
			messageErreur=QMessageBox(self)
			messageErreur.setText(_(u"<p>Vous n'avez pas chargé d'image(s) (bouton Ajouter) dans l'onglet <b>Image(s) avec canal aplpha</b>. Recommencez et chargez des images aussi bien dans <b>Image(s) avec canal aplpha</b>, que dans <b>Image(s) sans canal aplpha</b>.</p>"))
			messageErreur.setWindowTitle(_(u"Erreur"))
			messageErreur.setIcon(QMessageBox.Critical)
			messageErreur.exec_()
			return
		# -----------------------------------------------------------------------------
		
		
		try:
			# tImgAVcanAlph --> taille des images avec canal alpha
			# tImgSANScanAlph --> taille des images avec canal alpha
			# =/= --> différent
			# == --> strictement ègal
		
			# Si tImgAVcanAlph == entre elles et tImgSANScanAlph == entre elles
			# mais tImgAVcanAlph =/= tImgSANScanAlph (tImgAVcanAlph == tImgSANScanAlph
			# est aussi valable)
			if len(repRedimTemp_1)==0 and len(repRedimTemp_2)==0:
				im01=Image.open(self.listeChemAVcanAlph[nbreElem_1-1])
				im02=Image.open(self.listeChemSANScanAlph[0])
				# Redimensionnement à la tImgAVcanAlph
				im02=im02.resize(Image.open(self.listeChemAVcanAlph[nbreElem_1-1]).size, Image.ANTIALIAS)
				imgCompoUndeChaque=Image.composite(im01, im02, im01)
			# Si tImgAVcanAlph == entre elles et tImgSANScanAlph =/= entre elles
			elif len(repRedimTemp_1)==0 and len(repRedimTemp_2)>1:
				im01=Image.open(self.listeChemAVcanAlph[nbreElem_1-1])
				im02=Image.open(repRedimTemp_2[0])
				# Redimensionnement à la tImgAVcanAlph
				im02=im02.resize(Image.open(self.listeChemAVcanAlph[nbreElem_1-1]).size, Image.ANTIALIAS)
				imgCompoUndeChaque=Image.composite(im01, im02, im01)
			# Si tImgAVcanAlph =/= entre elles et tImgSANScanAlph =/= entre elles
			# Plusieurs images avec can alpha et plusieurs images sans can alpha
			elif len(repRedimTemp_1)>1 and len(repRedimTemp_2)>1:
				im01=Image.open(repRedimTemp_1[nbreElem_1-1])
				im02=Image.open(repRedimTemp_2[0])
				# Redimensionnement à la tImgAVcanAlph
				im02=im02.resize(Image.open(repRedimTemp_1[nbreElem_1-1]).size, Image.ANTIALIAS)
				imgCompoUndeChaque=Image.composite(im01, im02, im01)
			# Si tImgAVcanAlph =/= entre elles et tImgSANScanAlph == ... là on a
			# qu'une image sans canal alpha	ce qui correspond à un arrière plan fixe
			elif len(repRedimTemp_1)>1 and len(repRedimTemp_2)==0:
				im01=Image.open(repRedimTemp_1[nbreElem_1-1])
				im02=Image.open(self.listeChemSANScanAlph[0])
				# Redimensionnement à la tImgAVcanAlph
				im02=im02.resize(Image.open(repRedimTemp_1[nbreElem_1-1]).size, Image.ANTIALIAS)
				imgCompoUndeChaque=Image.composite(im01, im02, im01)
		
		except:
			messageErreur=QMessageBox(self)
			messageErreur.setText(_(u"<p><b>Première situation d'erreur:</b> Vous n'avez pas chargé d'image(s) (bouton Ajouter) dans l'onglet <b>Image(s) avec canal aplpha</b>. Recommencez et chargez des images aussi bien dans <b>Image(s) avec canal aplpha</b>, que dans <b>Image(s) sans canal aplpha</b>.</p><p><b>Seconde situation d'erreur:</b> la visualisation de l'image ne peut pas avoir lieu car vous avez répondu non au moins une fois au moment du redimensionnement des images. Recommencez et répondez oui aux deux boîtes de dialogue.</p>"))
			messageErreur.setWindowTitle(_(u"Erreur"))
			messageErreur.setIcon(QMessageBox.Critical)
			messageErreur.exec_()
			return
		
		# Sauvegarde des images resultant du Compositing
		self.cheminCourantSauv = self.repTamponVisuVoirRes+'visu_compositing_'+string.zfill((1), 6)+'.png'
		imgCompoUndeChaque.save(self.cheminCourantSauv, "PNG")

		# Affichage de l'image temporaire 
		# 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
示例#2
0
	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.
		Pour les commentaires, se référer à la fonction chang_format juste en dessous"""

		# Récupération du fichier sélectionné par l'utilisateur (si pas de fichier
		# sélectionné par l'utilisateur, la 1ère image de la liste est prise)
		file = self.afficheurImgSource.getFile()
		if not file: return
		self.listeImgSource = [file]

		i = self.comboReglage.currentIndex()
		ext=self.comboReglage.itemData(i).toString()
		ext=str(ext).lower()

		# Formats (extensions) supportées: .bmp, .gif, .jpeg, .jpg, .mng, .pbm, .pgm,
		# .png, .ppm, .svg, .tif, .tiff, .xbm, .xpm
		formats = [".%s" % unicode(format).lower() \
			for format in QImageReader.supportedImageFormats()]

		# Chemin+nom d'image pour la sauvegarde
		self.cheminCourantSauv = self.repTampon+'0_image_visu_'+string.zfill(1, 6)+ext

		# CONVERSION

		# Uniquement pour Linux et MacOSX
		if os.name in ['posix', 'mac']:
			# On sélectionne le 'Type de format après traitement' à JPEG (.jpg)
			# ou JPEG (.jpeg) le traitement se fait par Python Imaging Library
			if i in [0, 1]:
				im = Image.open(self.listeImgSource[0]).save(self.cheminCourantSauv, quality=self.spin3.value())
			# Si on sélectionne les autres entrées, le traitement se fait par ImageMagick
			else:
				import locale
				# Conversion immédiate dans le rep tampon
				os.system(("convert "+"\""+self.listeImgSource[0]+"\""+' '+"\""+self.cheminCourantSauv+"\"").encode(locale.getdefaultlocale()[1]))
				
		# Uniquement pour windows
		elif os.name == 'nt':
			# Dans la version windows les autres entrees ne sont pas traitees 
			# par ImageMagik mais directement par Python Imaging Library (car 
			# par le traitement avec ImageMagick rien ne s'affiche, bizarre !!!)
			if i in [0, 1, 2, 3, 4, 5, 6, 7]:
				im = Image.open(self.listeImgSource[0]).save(self.cheminCourantSauv, quality=self.spin3.value())

		# AFFICHAGE

		# Récup de l'extension chargée
		ext_chargee=os.path.splitext(self.listeImgSource[0])[1]

		# Si le format (l'extension) chargé et le format sélectionné pour la sortie
		# dans Réglages sont des formats supportés, l'image avec ce format est
		# simplement affichéé
		# ----------------------------------------------------------------------
		# Aussi bizarre que cela puisse paraître (et .xpm est un format reconnu)
		# la conversion en xpm se fait bien mais l'image n'est pas lue dans le
		# lecteur --> alors conversion en jpeg ... et l'image est lue
		# ----------------------------------------------------------------------
		if ext in formats:
			# Récupération de la liste contenant le chemin+fichier contenus
			# contenu dans le répertoire temporaire
			listeImgDestinVisuTmp_0=glob.glob(self.repTampon+'*.*')
			listeImgDestinVisuTmp_0.sort()
			# Elimination des fichiers parasites si multiples conversions
			# --> seulement l'extension de sortie sélectionnée est gardée
			for parctemp_0 in listeImgDestinVisuTmp_0:
				if os.path.splitext(parctemp_0)[1]!=ext:
					os.remove(parctemp_0)

		# Affichage de l'image temporaire
		# 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
示例#3
0
	def visu_1ere_derniere_img(self):
		"""Conversion des images"""
		
		# Récupération de l'identifiant du codec
		i = self.comboReglage.currentIndex()
		
		# Récupération du fichier sélectionné par l'utilisateur (si pas de fichier
		# sélectionné par l'utilisateur, la 1ère image de la liste est prise)
		file = self.afficheurImgSource.getFile()
		if not file: return
		self.listeChemin = [file]
		
		if self.listeComboReglage[i][1]=='redim_avec_ratio':
			""" Redimensionnement des images avec ratio """

			# Récup réglage ci-dessous
			spin = self.listeComboReglage[i][3].spin.value() # nouvelle largeur
				
			# Chemin de sauvegarde
			self.cheminCourantSauv = self.repTampon+'image_visu_redim_'+string.zfill(1, 6)+'.jpg'
				
			# Ouverture des images. Conversion et sauvegarde
			obImg = Image.open(self.listeChemin[0])
			
			# Recup dimensions de l'image
			w, h = obImg.size
			# Calcul du ratio de chaque image chargee
			ratio=float(w)/float(h)
			# Calcul de future hauteur avec les dimensions donnees par l'utilisateur
			calcHaut=float(spin)/ratio
			# Redimensionnement et sauvegarde des images
			finRedimSansRatio=obImg.resize((int(spin), int(calcHaut)), Image.ANTIALIAS).save(self.cheminCourantSauv)
			
			# Affichage de l'image temporaire 
			# 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
			
		elif self.listeComboReglage[i][1]=='redim_sans_ratio':
			""" Redimensionnement des images sans ratio """

			# Récup réglages ci-dessous
			spin1 = self.listeComboReglage[i][3].spin1.value() # nouvelle largeur
			spin2 = self.listeComboReglage[i][3].spin2.value() # nouvelle hauteur
				
			# Chemin de sauvegarde
			self.cheminCourantSauv = self.repTampon+'image_visu_redim_'+string.zfill(1, 6)+'.jpg'
				
			# Ouverture des images. Conversion et sauvegarde
			obImg = Image.open(self.listeChemin[0])
			
			# Redimensionnement et sauvegarde des images
			finRedimSansRatio=obImg.resize((int(spin1), int(spin2)), Image.ANTIALIAS).save(self.cheminCourantSauv)
			
			# Affichage de l'image temporaire 
			# 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