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
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
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