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
probleme avec pil [ par Logindejapris ]
Bonjour, Je voudrais récupérer la couleur d'un pixel sur mon bureau. A priori il n'y as pas d'autre possibilité que de faire un snapshoot et d'analy
|
Derniers Blogs
[MIX 2010] - LE KEYNOTE DAY 1 DISPONIBLE ONLINE ![MIX 2010] - LE KEYNOTE DAY 1 DISPONIBLE ONLINE ! par redo
Si tout comme moi, vous avez manqué de peu le premier keynote du Microsoft Mix 2010, je vous invite à prendre deux heure et le consulter ci-dessous . Visionnez le Keynote à l'url suivante : http://www.microsoft.com/Presspass/events/mix/videoGallery.aspx?c...
Cliquez pour lire la suite de l'article par redo VISUAL STUDIO TALK SHOW: EF4VISUAL STUDIO TALK SHOW: EF4 par Matthieu MEZIL
La semaine dernière, j'étais à Montréal pour y animer des conférences sur Entity Framework. J'en ai profité pour enregister un podcast Visual Studio Talk Show que vous pouvez retrouver ici ....(read more) ...
Cliquez pour lire la suite de l'article par Matthieu MEZIL [MIX 2010] - WINDOWS PHONE 7 EN SUPER STAR DU MICROSOFT MIX 2010 ![MIX 2010] - WINDOWS PHONE 7 EN SUPER STAR DU MICROSOFT MIX 2010 ! par redo
Me voici enfin arrivé au Microsoft Mix 2010, je dois vous avouer être arrivé un peu plus tard que d'habitude, ce qui explique que je n'ayez vu aucune info passer quant au premier keynote . certains événements sont plus importants que tout, ce qui était mo...
Cliquez pour lire la suite de l'article par redo [MIX 2010] - LIVRE GRATUIT SUR PROGRAMMER WINDOWS PHONE 7 SERIES ![MIX 2010] - LIVRE GRATUIT SUR PROGRAMMER WINDOWS PHONE 7 SERIES ! par redo
Disponible gratuitement : (153 pages) PDF Version : http://download.microsoft.com/download/7/C/8/7C820C6F-C205-4ECF-B9F3-1505DD13F9BF/ProgWinPhonePreview.pdf XPS Version : http://download.microsoft.com/download/E/3/5/E359FC51-1CF5-47F1-9BF3-74AB09D3339B/P...
Cliquez pour lire la suite de l'article par redo SQL SERVER : ESTIMER LE NOMBRE DE LIGNES RENVOYéES PAR UNE REQUêTE AVEC SQLCLRSQL SERVER : ESTIMER LE NOMBRE DE LIGNES RENVOYéES PAR UNE REQUêTE AVEC SQLCLR par christian
Dans certains cas très particuliers il peut être intéressant de savoir le nombre de ligne que va renvoyer une requête sans exécuter cette dernière. En effet les opérations de comptage sont généralement gourmande en ressource est très difficile à optim...
Cliquez pour lire la suite de l'article par christian
Logiciels
Xilisoft Convertisseur Vidéo Ultimate (5.1.39.0305)XILISOFT CONVERTISSEUR VIDéO ULTIMATE (5.1.39.0305)Xilisoft Convertisseur Vidéo Ultimate est un outil puissant de conversion vidéo, facile à utilise... Cliquez pour télécharger Xilisoft Convertisseur Vidéo Ultimate Xilisoft DVD Ripper Ultimate (5.0.64.0304)XILISOFT DVD RIPPER ULTIMATE (5.0.64.0304)Xilisoft DVD Ripper Ultimate est un logiciel excellent pour copier et convertir DVD vers presque ... Cliquez pour télécharger Xilisoft DVD Ripper Ultimate Rigs of Rods (63.3)RIGS OF RODS (63.3)c'est un jeu de multi-simulation camions,autobus voitures, avions, bateaux, hélicoptère avec défo... Cliquez pour télécharger Rigs of Rods Konvertor (4.00)KONVERTOR (4.00)Le logiciel est un gestionnaire multimedia affichant, jouant et convertissant plus de 2000 format... Cliquez pour télécharger Konvertor
|