Redimensionnement d'images

Soyez le premier à donner votre avis sur cette source.

Vue 11 126 fois - Téléchargée 466 fois

Description

Un petit script avec interface graphique permettant de redimensionner des images au format jpg.

Le principe est simple, on va analyser le contenu d'un répertoire "source", et redimensionner toutes les images au format jpg du répertoire "source" dans un repertoire "destination".

Les répertoires "source", et "destination", ainsi que les dimensions des images ont des valeurs par default modifiable via les menu de controle. Les paramètres par default sont enregistrés dans un second fichier .txt appellé "parameters.txt". Ils sont modifiable via l'interface graphique grâce au menu "Paramètres --> Préférences".

J'ai inséré le code du fichier "parameters.txt" à la fin du code principal (5 dernières lignes)...

Source / Exemple :


#! D:/Python25/python.exe
import Image
import Tkinter
import tkFileDialog
import os

class PySize:
	def __init__(self, parent):
		"""Initialisation de l'IGU"""
		self.parent=parent
		self.parent.title("Redimensionnement d'image")
		self.option=0#Variable permettant de definir si on modifie les parametres par default
		self.menuBar()
		self.widget()
		self.container=Tkinter.Frame(self.parent)
		self.interface=Tkinter.Text(self.container)
		self.interface.insert('end','Bonjour et bienvenu\nPour tout renseignement tonny.rosca@gmail.com\n...')
		self.interface.pack(side='left',expand='YES',fill='both')
		self.yscrollbar=Tkinter.Scrollbar(self.container)
		self.yscrollbar.pack(side='right',fill='y')
		self.container.pack(fill='both')
		self.yscrollbar.config(command=self.interface.yview)
		self.interface.insert('end','Chargement des parametres\n...')
		try:
			param={}
			fileOption=open('parameters.txt','r')
			while 1:
				line=fileOption.readline()
				if line=="":
					break
				exec(line)
			self.pathIn=param['pathIn']
			self.pathOut=param['pathOut']
			self.L=param['L']
			self.l=param['l']
			self.interface.insert('end',"Parametres charges avec succes :\n......Repertoire d'entree : "+str(self.pathIn)+"\n......Repertoire de sortie : "+str(self.pathOut)+"\n......Dimension des images de sortie : "+str(self.L)+"*"+str(self.l)+"\n...")
		except:
			self.interface.insert('end',"Erreur lors du chargement des parametres ! Verifier le contenu du fichier 'parameters.txt'\n...")

	def menuBar(self):
		"""Initialisation de la barre de menu"""
		menu=Tkinter.Menu()
		fichier=Tkinter.Menu()
		fichier.add_command(label='Quitter',command=self.parent.destroy)
		menu.add_cascade(label='Fichier',menu=fichier)
		parameters=Tkinter.Menu()
		parameters.add_command(label="Choix du repertoire d'entree",command=self.askPathIn)
		parameters.add_command(label="Choix du repertoire de sortie",command=self.askPathOut)
		parameters.add_command(label="Choix de la dimension des images",command=self.outSize)
		parameters.add_command(label="Preferences",command=self.options)
		menu.add_cascade(label='Parametres',menu=parameters)
		aide=Tkinter.Menu()
		aide.add_command(label='A propos...',command=self.aboutVersion)
		aide.add_command(label='Aide',command=self.aboutAuthor)
		menu.add_cascade(label='?',menu=aide)
		self.parent.config(menu=menu)

	def aboutAuthor(self):
		"""Joindre l'auteur"""
		self.interface.insert('end','1. Choisir le repertoire contenant les images a redimensionner\n...2. Choisir le repertoire de sortie\n...3. Choisir les dimensions des images de sortie\n...Pour tout renseignement tonny.rosca@gmail.com\n...')
		self.yscrollbar.config(command=self.interface.yview)

	def aboutVersion(self):
		"""Version"""
		self.interface.insert('end',"Redimensionnement d'image V1.3\n...")
		self.yscrollbar.config(command=self.interface.yview)

	def widget(self):
		"""Boutons d'action"""
		self.button=Tkinter.Frame(self.parent)
#		self.b0=Tkinter.Button(self.button,text="Choisir un repertoire d'entree",command=self.askPathIn)
#		self.b1=Tkinter.Button(self.button,text="Choisir un repertoire de sortie",command=self.askPathOut)
#		self.b2=Tkinter.Button(self.button,text="Choisir les dimensions des images",command=self.outSize)
		self.b3=Tkinter.Button(self.button,text="Effectuer le traitement",command=self.searchFiles)
#		self.b0.pack(side='left',expand='YES',fill='both')
#		self.b1.pack(side='left',expand='YES',fill='both')
#		self.b2.pack(side='left',expand='YES',fill='both')
		self.b3.pack(side='left',expand='YES',fill='both')
		self.button.pack(side='top',expand='YES',fill='both')

	def askPathIn(self):
		"""Fenetre de selection d'un repertoire d'entree"""
		self.pathIn=tkFileDialog.askdirectory(parent=self.parent,initialdir=self.pathIn,title="Choisissez un repertoire d'entree")
		self.interface.insert('end',"Repertoire d'entree : "+str(self.pathIn)+"\n...")

	def askPathOut(self):
		"""Fenetre de selection d'un repertoire de sortie"""
		self.pathOut=tkFileDialog.askdirectory(parent=self.parent,initialdir=self.pathOut,title='Choisissez un repertoire de sortie')
		self.interface.insert('end','Repertoire de sortie : '+str(self.pathOut)+'\n...')

	def searchFiles(self):
		"""Traitement des images en parcourant le repertoire"""
		count=0
		path=os.listdir(self.pathIn)
		self.interface.insert('end',"Traitement des l'images en cours\n...")
		for i in range(len(path)):
			if path[i].count('.jpg')==1 or path[i].count('.JPG')==1:
				count+=1
				self.fileName=path[i]
				self.resize()
				self.interface.insert('end',"Image "+str(count)+" en cours de traitement\n...")
				root.update()
		self.interface.insert('end',"Traitement effectue avec succes\n...")

	def resize(self):
		""""Redimensionne une image"""
		imageResize=Image.open(self.pathIn+'/'+self.fileName,'r')
		#On regarde si l'image est horizontale ou verticale
		if imageResize.size[0]>imageResize.size[1]:
			imageResize.thumbnail((self.L,self.l))
			imageOut=Image.new(imageResize.mode,(self.L,self.l))
			imageOut.paste(imageResize,(0,0,imageResize.size[0],imageResize.size[1]))
		else:
			imageResize.thumbnail((self.l,self.L))
			imageOut=Image.new(imageResize.mode,(self.l,self.L))
			imageOut.paste(imageResize,(0,0,imageResize.size[0],imageResize.size[1]))
		imageOut.save(self.pathOut+'/'+self.fileName[:-4]+'_'+str(self.L)+'_'+str(self.l)+'.jpg',"JPEG")

	def outSize(self):
		"""Fenetre de choix des dimensions des images de sortie"""
		self.paramWindow=Tkinter.Toplevel()
		self.paramWindow.title("Dimensions des images de sortie")
		container=Tkinter.Frame(self.paramWindow)
		self.xPixel=Tkinter.Entry(container)
		self.xPixel.pack(fill='x',side='left')
		self.xPixel.insert('0','800')
		self.yPixel=Tkinter.Entry(container)
		self.yPixel.pack(fill='x',side='left')
		self.yPixel.insert('0','600')
		containerButton=Tkinter.Frame(self.paramWindow)
		buttonValid=Tkinter.Button(containerButton,text='Valider',command=self.validSize)
		buttonValid.pack(fill='x')
		buttonCancel=Tkinter.Button(containerButton,text='Annuler',command=self.paramWindow.destroy)
		buttonCancel.pack(fill='x')
		container.pack(fill='x')
		containerButton.pack(fill='x')

	def validSize(self):
		"""Valide le choix des dimensions des images de sortie"""
		if int(self.xPixel.get())>int(self.yPixel.get()):
			self.L=int(self.xPixel.get())
			self.l=int(self.yPixel.get())
		else:
			self.L=int(self.yPixel.get())
			self.l=int(self.xPixel.get())
		self.interface.insert('end',"Dimensions des images de sortie : "+str(self.L)+"*"+str(self.l)+"\n...")
		self.paramWindow.destroy()
		if self.option==1:#On verifie si les modifications doivent etre enregistrees
			self.option=0
			self.validDefault()

	def options(self):
		"""Modification des parametres par default"""
		self.option=1
		self.interface.insert('end',"Modification des parametres par default\n...")
		self.askPathIn()
		self.askPathOut()
		self.outSize()

	def validDefault(self):
		self.interface.insert('end',"Sauvegarde des preferences\n...")
		try:
			fileIn=open('parameters.txt','w')
			fileIn.write("param['pathIn']='"+self.pathIn+"'\nparam['pathOut']='"+self.pathOut+"'\nparam['L']="+str(self.L)+"\nparam['l']="+str(self.l)+"\n")
			fileIn.close()
			self.interface.insert('end',"Sauvegarde effectuee avec succes\n...")
		except:
			self.interface.insert('end',"Erreur lors de la sauvegarde : Verifiez vos droit en ecriture sur le fichier 'parameters.py'")

Image.init()
root=Tkinter.Tk()
myapp=PySize(root)
root.mainloop()

#fichier parameters.txt a sauvegarder dans le meme repertoire
#param['pathIn']='D:/Images'
#param['pathOut']='D:/Images'
#param['L']=800
#param['l']=600

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
9
Date d'inscription
dimanche 18 février 2007
Statut
Membre
Dernière intervention
18 juillet 2018

Salut,
Merci pour l'info, j'ai corrigé cette erreur.
J'ai également modifié légèrement le chargement et la sauvegarde des paramètres par default pour permettre l'exécution correcte sous windows après compilation (py2exe).
Messages postés
382
Date d'inscription
mercredi 23 août 2006
Statut
Membre
Dernière intervention
8 novembre 2010
11
C'est un bon programme, mais il y a une petite erreur : "Aide" et "À propos de ..." sont inversé (au niveau des fonctions). A par ça tout va bien
Messages postés
382
Date d'inscription
mercredi 23 août 2006
Statut
Membre
Dernière intervention
8 novembre 2010
11
Pardon, je n'avais pas vu ton explication à la fin du commentaire
Messages postés
382
Date d'inscription
mercredi 23 août 2006
Statut
Membre
Dernière intervention
8 novembre 2010
11
Salut,

J'ai une question : que doit comptenir le fichier "parameters.py" ?

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.