Accueil > > > ALBUMEUR PHOTO: SCRIPT DE CRÉATION D'ALBUM PHOTO EN HTML À PARTIR D'UN DOSSIER CONTENANT DES IMAGES (UTILISE PIL)
ALBUMEUR PHOTO: SCRIPT DE CRÉATION D'ALBUM PHOTO EN HTML À PARTIR D'UN DOSSIER CONTENANT DES IMAGES (UTILISE PIL)
Information sur la source
Description
Ce code est un script que j'avais réalisé pour mes besoins personnels. En effet, je fais tourner un petit serveur apache maison, et je m'étais demandé si j'allais m'atteler à la tache de réaliser une application PHP/SQL pour gérer mes albums de photo. J'hésitais car je trouvais cela assez lourd par rapport aux besoins ponctuels que j'avais d'afficher des photos (photos de vacances de temps en temps par exemple). Et un jour, EUREKA! L'idée m'est venue : J'allais réaliser un script python qui s'occupait de tout: Organisation: Des fichiers images dans un répertoire donné (pour l'instant, il ne gère que les jpeg) Méthode: Le script parcourt simplement les fichiers du répertoire, pour chaque image il crée une miniature(thumbnail) et une réduction: image un peu plus légère que les gros fichiers photos numériques qui peuvent allegrement atteindre les 5Mo l'image. Il génère ensuite le code HTML de la page dont l'architecture principale est une <TABLE> qui affiche les photos. Au final, on se retrouve avec le dossier de départ qui contient les images de départ + leurs miniatures + leurs réductions ainsi qu'un fichier html qui contient l'album photo. Ce script nécessite PIL (Python Imaging Library) que vous pourrez télécharger ici gratuitement: http://www.pythonware.com/products/pil/ Cette bibliothèque contient moultes fonctionnalités de manipulation d'image, vraiment très bien pensées.
Source
- # -*- coding: cp1252 -*-
- """
- Albumeur photo:
- script python écrit par VyCHNou (vychnou@hotmail.com)
- Transforme un répertoire contenant des photos en album photo html avec création de thumbnails et de réductions des photos.
- """
- import os, sys, Image, time
- from optparse import OptionParser
- def resize(im,x,y):
- """retourne l'image redimensionnée(diminution) en gardant les proportions"""
- if ((im.size[0]/x)>(im.size[1]/y)):
- coeffResize=float(im.size[0]/float(x))
- else:
- coeffResize=float(im.size[1]/float(y))
- return im.resize((int(round((im.size[0]/coeffResize))),int(round((im.size[1]/coeffResize)))))
-
- def fichierOk(dir, fic):
- """retourne True si le fichier est ok, False sinon"""
- fic=fic.lower()
- if (os.path.isfile(dir+os.sep+fic) and fic[len(fic)-4:len(fic)]==".jpg" and fic[0:6]!="petit_" and fic[0:6]!="moyen_"):
- return True
- else:
- return False
-
- listePhotos=[]
- parser=OptionParser()
- parser.add_option("-i", "--i", "--interactif",
- dest="interactif", action="store_true", default=False,
- help="lance le script en mode interactif)")
- parser.add_option("-d", "--d", "--dossier", action="store",
- dest="dossier", type="string",
- help="dossier a transformer en album photo")
- parser.add_option("--html", "--fichier_html", action="store",
- dest="html", type="string",
- help="nom du fichier html genere",
- default="index.html")
- parser.add_option("--css", "--fichier_css", action="store",
- dest="css", type="string",
- help="nom du fichier css utilise (pas d'option=pas de fichier css utilise)")
- parser.add_option("-t", "--t", "--titre", action="store",
- dest="titre", type="string",
- help="titre de l'album",
- default="album photo")
- parser.add_option("-c", "--c", "--commentaire", action="store",
- dest="commentaire", type="string",
- help="commentaire sur l'album",
- default="Quelques photos du dossier ")
- parser.add_option("--nc", "--nombre_colonnes", action="store",
- dest="nombre_colonnes", type="int",
- help="nombre de colonnes de photos",
- default=4)
- parser.add_option("--lm", "--largeur_miniature", action="store",
- dest="largeur_miniature", type="int",
- help="largeur en pixels d'une miniature (thumbnail)",
- default=200)
- parser.add_option("--hm", "--hauteur_miniature", action="store",
- dest="hauteur_miniature", type="int",
- help="hauteur en pixels d'une miniature (thumbnail)",
- default=200)
- parser.add_option("--lr", "--largeur_reduction", action="store",
- dest="largeur_reduction", type="int",
- help="largeur en pixels d'une reduction",
- default=800)
- parser.add_option("--hr", "--hauteur_reduction", action="store",
- dest="hauteur_reduction", type="int",
- help="hauteur en pixels d'une reduction",
- default=600)
- parser.add_option("-q", "--q", "--qualite", action="store",
- dest="qualite", type="int",
- help="qualite des miniatures",
- default=80)
- (options, args) = parser.parse_args()
- if (options.interactif):
- options.dossier=raw_input("repertoire a transformer en album photo ? >>")
- options.html=raw_input("nom du fichier html album photo ? >>")
- options.titre=raw_input("titre de votre album ? >>")
- options.commentaire=raw_input("commentaire sur votre album ? >>")
- options.nombre_colonnes=int(raw_input("nombre de colonnes de photo ? >>"))
- options.largeur_miniature=int(raw_input("largeur des miniatures ? >>"))
- options.hauteur_miniature=int(raw_input("hauteur des miniatures ? >>"))
- options.largeur_reduction=int(raw_input("largeur des photos allegees? >>"))
- while (options.largeur_miniature>=options.largeur_reduction):
- print "Miniature doit etre moins large que photo allegee"
- options.largeur_reduction=int(raw_input("largeur des photos allegees? >>"))
- options.hauteur_reduction=int(raw_input("hauteur des photos allegees? ? >>"))
- while (options.hauteur_miniature>=options.hauteur_reduction):
- print "Miniature doit etre moins haute que photo allegee"
- options.hauteur_reduction=int(raw_input("hauteur des photos allegees? ? >>"))
- options.qualite=int(raw_input("qualite des miniatures ?(chiffre entre 1 et 100) >>"))
- #on liste les fichiers du répertoire
- listePhotos=[]
- for fichier in os.listdir(options.dossier):
- if (fichierOk(options.dossier,fichier)):
- listePhotos.append(fichier)
- print str(len(listePhotos))+" images a traiter dans "+options.dossier
- nbImages=len(listePhotos)
- cptImage=1
- pourtrenteage=0
- pourtrenteagetmp=0
- #on parcours tous les fichiers du dossier entré
- for fichier in listePhotos:
- #on ouvre le fichier image
- im = Image.open(options.dossier+os.sep+fichier)
- #on ouvre le fichier de la réduction
- outfile=options.dossier+os.sep+"moyen_"+fichier
- try:
- #on met à l'échelle la réduction
- im=resize(im,options.largeur_reduction,options.hauteur_reduction)
- #on la sauvegarde dans le fichier dont le nom commence par moyen_
- #en qualité maximale
- im.save(outfile,quality=100)
- except IOError:
- print "cannot convert"
- im = Image.open(options.dossier+os.sep+fichier)
- #on ouvre le fichier de la miniature
- outfile=options.dossier+os.sep+"petit_"+fichier
- try:
- #on met à l'échelle la miniature
- im=resize(im,options.largeur_miniature,options.hauteur_miniature)
- #on sauvegarde la miniature à la qualité voulue dans le fichier dont le
- #nom commence par petit_ et à la qualité voulue
- im.save(outfile,quality=options.qualite)
- except IOError:
- print "cannot convert"
- #on affiche un renseignement sur la console
- #print "{"+str(cptImage)+"/"+str(nbImages)+"} Fichier [ "+fichier+" ] traite"
- ratio=(float)(cptImage)/nbImages
- str="["
- for i in range((int)(50*ratio)):
- str=str+"#"
- for i in range((int)(50-(50*ratio))):
- str=str+" "
- str=str+"]"
- print str
- cptImage=cptImage+1
- #On calcule le nombre de lignes à partir du nombre de colonnes et du nombre de photos
- nombreDeLignes=int(round(float(len(listePhotos))/float(options.nombre_colonnes)))
- #on ajuste la derniere ligne
- if (nombreDeLignes<(float(len(listePhotos))/float(options.nombre_colonnes))):
- nombreDeLignes=nombreDeLignes+1
- #On génère le début du code html
- if (options.css!=None):
- codecss= '''<style type="text/css" title="default" media="screen">
- @import "'''+nomCss+'''";
- </style>'''
- else:
- codecss=""
- album_photo_html='''
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/HTML4/loose.dtd">
- <head>
- <title>'''+options.titre+'''</title>
- '''+codecss+'''
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
- </head>
- \n<body>
- <h1>'''+options.titre+'''</h1>
- '''+options.commentaire+'''
- <table width="100%" border="0">
- '''
- site="http://vychnou.info/test"
- #on va maintenant construire le tableau HTML de photos
- #pour chaque ligne de photos à créer:
- for i in range(nombreDeLignes):
- j=0
- #nouvelle ligne de la table:
- album_photo_html=album_photo_html+' <tr>'
- #ajout de chaque photo dans une balise img, génération des liens etc..:
- while (j<options.nombre_colonnes and ((i*options.nombre_colonnes)+j)<len(listePhotos)):
- album_photo_html=album_photo_html+'<td>\n <a href="moyen_'+listePhotos[(i*options.nombre_colonnes)+j]+'''">
- <img src="petit_'''+listePhotos[(i*options.nombre_colonnes)+j]+'" alt="'+listePhotos[(i*options.nombre_colonnes)+j]+'''"/></a><br>\n
- <a href="'''+listePhotos[(i*options.nombre_colonnes)+j]+'">'+listePhotos[(i*options.nombre_colonnes)+j]+'</a>\n </td>\n'
- j=j+1
- #fin de ligne de la table:
- album_photo_html=album_photo_html+'</tr>'
- album_photo_html=album_photo_html+'''
- </table>
- <i>album photo réalisé à l'aide d'un script python écrit par VyCHNou (vychnou@hotmail.com)</i>
- </body>
- '''
- #on ouvre le fichier dans lequel on veut le sauvegarder
- f=open(options.dossier+os.sep+options.html,"w")
- #on écrit dedans ce code html
- f.write(album_photo_html)
- f.close()
- #on informe l'utilisateur de la fin des opérations
- print "\n>>>Fichier [ "+options.dossier+os.sep+options.html+ "] cree\n\n>>>>>>ALBUM PHOTO CREE<<<<<<"
# -*- coding: cp1252 -*-
"""
Albumeur photo:
script python écrit par VyCHNou (vychnou@hotmail.com)
Transforme un répertoire contenant des photos en album photo html avec création de thumbnails et de réductions des photos.
"""
import os, sys, Image, time
from optparse import OptionParser
def resize(im,x,y):
"""retourne l'image redimensionnée(diminution) en gardant les proportions"""
if ((im.size[0]/x)>(im.size[1]/y)):
coeffResize=float(im.size[0]/float(x))
else:
coeffResize=float(im.size[1]/float(y))
return im.resize((int(round((im.size[0]/coeffResize))),int(round((im.size[1]/coeffResize)))))
def fichierOk(dir, fic):
"""retourne True si le fichier est ok, False sinon"""
fic=fic.lower()
if (os.path.isfile(dir+os.sep+fic) and fic[len(fic)-4:len(fic)]==".jpg" and fic[0:6]!="petit_" and fic[0:6]!="moyen_"):
return True
else:
return False
listePhotos=[]
parser=OptionParser()
parser.add_option("-i", "--i", "--interactif",
dest="interactif", action="store_true", default=False,
help="lance le script en mode interactif)")
parser.add_option("-d", "--d", "--dossier", action="store",
dest="dossier", type="string",
help="dossier a transformer en album photo")
parser.add_option("--html", "--fichier_html", action="store",
dest="html", type="string",
help="nom du fichier html genere",
default="index.html")
parser.add_option("--css", "--fichier_css", action="store",
dest="css", type="string",
help="nom du fichier css utilise (pas d'option=pas de fichier css utilise)")
parser.add_option("-t", "--t", "--titre", action="store",
dest="titre", type="string",
help="titre de l'album",
default="album photo")
parser.add_option("-c", "--c", "--commentaire", action="store",
dest="commentaire", type="string",
help="commentaire sur l'album",
default="Quelques photos du dossier ")
parser.add_option("--nc", "--nombre_colonnes", action="store",
dest="nombre_colonnes", type="int",
help="nombre de colonnes de photos",
default=4)
parser.add_option("--lm", "--largeur_miniature", action="store",
dest="largeur_miniature", type="int",
help="largeur en pixels d'une miniature (thumbnail)",
default=200)
parser.add_option("--hm", "--hauteur_miniature", action="store",
dest="hauteur_miniature", type="int",
help="hauteur en pixels d'une miniature (thumbnail)",
default=200)
parser.add_option("--lr", "--largeur_reduction", action="store",
dest="largeur_reduction", type="int",
help="largeur en pixels d'une reduction",
default=800)
parser.add_option("--hr", "--hauteur_reduction", action="store",
dest="hauteur_reduction", type="int",
help="hauteur en pixels d'une reduction",
default=600)
parser.add_option("-q", "--q", "--qualite", action="store",
dest="qualite", type="int",
help="qualite des miniatures",
default=80)
(options, args) = parser.parse_args()
if (options.interactif):
options.dossier=raw_input("repertoire a transformer en album photo ? >>")
options.html=raw_input("nom du fichier html album photo ? >>")
options.titre=raw_input("titre de votre album ? >>")
options.commentaire=raw_input("commentaire sur votre album ? >>")
options.nombre_colonnes=int(raw_input("nombre de colonnes de photo ? >>"))
options.largeur_miniature=int(raw_input("largeur des miniatures ? >>"))
options.hauteur_miniature=int(raw_input("hauteur des miniatures ? >>"))
options.largeur_reduction=int(raw_input("largeur des photos allegees? >>"))
while (options.largeur_miniature>=options.largeur_reduction):
print "Miniature doit etre moins large que photo allegee"
options.largeur_reduction=int(raw_input("largeur des photos allegees? >>"))
options.hauteur_reduction=int(raw_input("hauteur des photos allegees? ? >>"))
while (options.hauteur_miniature>=options.hauteur_reduction):
print "Miniature doit etre moins haute que photo allegee"
options.hauteur_reduction=int(raw_input("hauteur des photos allegees? ? >>"))
options.qualite=int(raw_input("qualite des miniatures ?(chiffre entre 1 et 100) >>"))
#on liste les fichiers du répertoire
listePhotos=[]
for fichier in os.listdir(options.dossier):
if (fichierOk(options.dossier,fichier)):
listePhotos.append(fichier)
print str(len(listePhotos))+" images a traiter dans "+options.dossier
nbImages=len(listePhotos)
cptImage=1
pourtrenteage=0
pourtrenteagetmp=0
#on parcours tous les fichiers du dossier entré
for fichier in listePhotos:
#on ouvre le fichier image
im = Image.open(options.dossier+os.sep+fichier)
#on ouvre le fichier de la réduction
outfile=options.dossier+os.sep+"moyen_"+fichier
try:
#on met à l'échelle la réduction
im=resize(im,options.largeur_reduction,options.hauteur_reduction)
#on la sauvegarde dans le fichier dont le nom commence par moyen_
#en qualité maximale
im.save(outfile,quality=100)
except IOError:
print "cannot convert"
im = Image.open(options.dossier+os.sep+fichier)
#on ouvre le fichier de la miniature
outfile=options.dossier+os.sep+"petit_"+fichier
try:
#on met à l'échelle la miniature
im=resize(im,options.largeur_miniature,options.hauteur_miniature)
#on sauvegarde la miniature à la qualité voulue dans le fichier dont le
#nom commence par petit_ et à la qualité voulue
im.save(outfile,quality=options.qualite)
except IOError:
print "cannot convert"
#on affiche un renseignement sur la console
#print "{"+str(cptImage)+"/"+str(nbImages)+"} Fichier [ "+fichier+" ] traite"
ratio=(float)(cptImage)/nbImages
str="["
for i in range((int)(50*ratio)):
str=str+"#"
for i in range((int)(50-(50*ratio))):
str=str+" "
str=str+"]"
print str
cptImage=cptImage+1
#On calcule le nombre de lignes à partir du nombre de colonnes et du nombre de photos
nombreDeLignes=int(round(float(len(listePhotos))/float(options.nombre_colonnes)))
#on ajuste la derniere ligne
if (nombreDeLignes<(float(len(listePhotos))/float(options.nombre_colonnes))):
nombreDeLignes=nombreDeLignes+1
#On génère le début du code html
if (options.css!=None):
codecss= '''<style type="text/css" title="default" media="screen">
@import "'''+nomCss+'''";
</style>'''
else:
codecss=""
album_photo_html='''
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/HTML4/loose.dtd">
<head>
<title>'''+options.titre+'''</title>
'''+codecss+'''
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
\n<body>
<h1>'''+options.titre+'''</h1>
'''+options.commentaire+'''
<table width="100%" border="0">
'''
site="http://vychnou.info/test"
#on va maintenant construire le tableau HTML de photos
#pour chaque ligne de photos à créer:
for i in range(nombreDeLignes):
j=0
#nouvelle ligne de la table:
album_photo_html=album_photo_html+' <tr>'
#ajout de chaque photo dans une balise img, génération des liens etc..:
while (j<options.nombre_colonnes and ((i*options.nombre_colonnes)+j)<len(listePhotos)):
album_photo_html=album_photo_html+'<td>\n <a href="moyen_'+listePhotos[(i*options.nombre_colonnes)+j]+'''">
<img src="petit_'''+listePhotos[(i*options.nombre_colonnes)+j]+'" alt="'+listePhotos[(i*options.nombre_colonnes)+j]+'''"/></a><br>\n
<a href="'''+listePhotos[(i*options.nombre_colonnes)+j]+'">'+listePhotos[(i*options.nombre_colonnes)+j]+'</a>\n </td>\n'
j=j+1
#fin de ligne de la table:
album_photo_html=album_photo_html+'</tr>'
album_photo_html=album_photo_html+'''
</table>
<i>album photo réalisé à l'aide d'un script python écrit par VyCHNou (vychnou@hotmail.com)</i>
</body>
'''
#on ouvre le fichier dans lequel on veut le sauvegarder
f=open(options.dossier+os.sep+options.html,"w")
#on écrit dedans ce code html
f.write(album_photo_html)
f.close()
#on informe l'utilisateur de la fin des opérations
print "\n>>>Fichier [ "+options.dossier+os.sep+options.html+ "] cree\n\n>>>>>>ALBUM PHOTO CREE<<<<<<"
Conclusion
Ce script tourne simplement sur la console. Il peut marcher en mode interactif (python albumeur.py -i) et il va alors demander de renseigner divers paramètres. Il peut aussi marcher en mode passage d'arguments pour une utilisation beaucoup plus rapide. (l'option -h affichera une aide en ligne de commandes qui explique tout).
Exemple: python albumeur.py -d "c:\photos\Vacances 2005" -t "vacances en Espagne" -c "Tata Robert et toute la famille dans les environs de Valence" -nc 5 -lm 180 -hm 180 -lr 800 -hr 600 -html index.htm -css css.css Génère un album photo à partir du dossier (-d) c:\photos\Vacances 2005 dont le titre (-t) sera vacances en Espagne, dont le commentaire (-c) sera "Tata Robert et toute la famille dans les environs de Valence", qui aura 5 colonnes (-nc), des miniatures de 180pixels de large (-lm) et de 180pixels de haut (-hm), des réductions de 800 pixels de large (-lr), 600 pixels de haut(-hr), dont le nom du fichier html de sortie sera index.htm (-html), dont le nom du fichier css(-css facultatif) sera css.css .
Pour une démonstration du résultat, allez voir: http://vychnou.info/albumeur/demo
Divers choses restent à améliorer: -Gestions des erreurs de saisie -Compatibilité avec plus de types d'images (très simple à faire, il suffit de se baser sur les images que PIL accepte de traiter) -Gestion des codes spéciaux dans les fichiers HTML (ça ne doit pas être très compliqué à faire non plus) ... N'hésitez pas à laisser des commentaires, en bien ou en mal
Historique
- 17 octobre 2006 14:38:03 :
- Correction d'un bug: le script doit quitter après avoir affiché l'aide par l'option -h
- 17 octobre 2006 14:55:50 :
- Correction: utilisation de os.sep au lieu de "\\" pour rendre le script compatible avec d'autres systèmes de fichiers
- 17 octobre 2006 15:10:33 :
- Correction des effets pervers d'un "remplacer tout" qui avait rendu la page html générée non conforme aux recommandations W3C.
Désormais, la page HTML générée sera une page HTML 4.01 Transitionnal valide.
- 08 novembre 2006 18:16:03 :
- Gestion des arguments à l'aide d'optparse.
Nettoyage du code
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
comment créer un fichier HTML avec Python [ par anwaarber ]
salut a tous,j'ai un problème lors de la création d'un fichier HTML avec pythonsurtout quand je fait passer des variables dans le code :def
Python peut être interpreté par un navigateur comme dans html [ par rabikisa ]
Est-ce possible d'interpreter python à partir d'un navigateur si on utilise une base de données gadfly?(comme les pages html quoi...)si possible comme
Script Python pour html [ par aera group ]
Bonjour, je uis actuelement au chapitre 17 du tutoriel de Gérard Swinnen : Apprendre à programmer avec Python (téléchargable sur http://www.cifen.ulg.
html [ par MimiEtude ]
slt tous le monde!!!pouvez vous m'expliquer le sens ou bien la fonction de cette instruction?<meta name="MSSmartTagsPreventParsing" content="TRUE"
Problème avec draw.text du module PIL [ par MasterID ]
Modifier titre page html [ par miniimoi ]
Bonjour,je dois créer un proxy en python pour un projet et il faut que je recupere le titre de la page html et le modifier.Je suis novice dans ce doma
recupérer le contenu html d'1 site [ par sakusou ]
salut à tous, Je dois récupérer le contenu html d'un site web à partir de l'url en python, pour faire ça, j'ai pensé à d'abord récupérer l'arborescenc
|
Derniers Blogs
TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2010 : PLAN DE MIGRATION VERS SHAREPOINT 2010TECHDAYS PARIS 2010 : PLAN DE MIGRATION VERS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Arnault Nouvel et Antoine Dongois Le processus à prendre : Apprendre (découvrir la plateforme) Préparer (documenter l'historique et choisir la méthode de MAJ) Test (Test de MAJ) Implémenter (Effectuer la MAJ) Valid...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2010 : LA PLEINIèRE DU SECOND JOURTECHDAYS PARIS 2010 : LA PLEINIèRE DU SECOND JOUR par ROMELARD Fabrice
Après un retour sur l'histoire des TechDays de Paris et le fait que ce soit le plus gros event MS au monde (du fait de sa gratuité), le président de MS France (Eric Boustoullier) a fait une présentation de la vision Microsoft pour les années à venir...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|