| Jacques's profilejanelPhotosBlogLists | Help |
|
|
October 11 Faites votre BA du jourVous n’avez pas encore fait votre bonne action aujourd’hui ? Voici l’occasion de vous racheter et de finir la journée en beauté. Votez pour la photo que j’ai publiée sur http://www.picture.com, vous me ferez peut-être gagner un iPod Shuffle :
Et si je gagne l’iPod, je serai plus heureux, donc en meilleure forme, donc plus créatif sur mon blog. Donc un bénéfice également pour vous. Ca c’est du gagnant-gagnant ou je ne m’y connais pas !
Merci d’avance,
Janel April 12 Modifiez la taille de vos images avec PowerShellJe passe beaucoup de mon temps libre à faire de la photo. Il m’arrive d’en publier sur des sites comme www.parlons-photo.com, ou sur les forums Usenet, ou encore sur mon blog personnel. Et à chaque fois je passe un temps significatif voire considérable à redimensionner mes images selon les contraintes du site ou du forum. Par exemple, www.parlons-photo.com impose un format où la plus grande dimension ne peut pas dépasser 700 pixels et où la taille du fichier doit être inférieure à 100 Ko.
Après un nombre suffisant de manipulations laborieuses avec les différents logiciels de traitement d’image en ma possession, j’ai décidé d’étudier ce que Windows PowerShell pouvait faire pour moi. Et ô joie, PowerShell pouvait faire beaucoup, pour peu que je mette un peu d’énergie à écrire le bon script.
A vrai dire, je ne partais pas d’une page blanche. L’année dernière j’avais écrit un script out-album.ps1 générant un album photo en HTML très rudimentaire. A partir d’une liste d’images, le script générait des vues réduites et enregistrait dans une page HTML un lien hypertexte vers ces vues réduites. Le script acceptait plusieurs types de réduction. Pour plus d’informations sur ce script, voyez mon billet de l’époque.
J’ai donc repris ce script, en supprimant la partie création d’une page HTML et en étoffant la gestion du redimensionnement. Aux critères existants de largeur (Width), hauteur (Height) et ratio (Ratio), j’ai ajouté les options suivantes :
Dim
Permet de spécifier une taille à appliquer à la plus grande dimension. Par exemple, si vous voulez qu’une série de photos soient redimensionnées de manière à ce que la plus grande dimension soit toujours de 700 pixels, qu’il s’agisse de la largeur ou de la hauteur, spécifiez -dim 700 et le tour est joué. L’autre dimension est alors calculée en proportion.
MaxSize
Permet de spécifier une taille maximale pour le fichier résultant du redimensionnement. Par exemple si vous devez publier des photos dont la taille de fichier doit être inférieure à 100 Ko, spécifiez -maxsize 99KB et le tour est joué. Notez au passage que toutes les formes de notation possibles dans PowerShell sont acceptées y compris les suffixes KB, MB et GB.
La taille souhaitée est obtenue en jouant sur la qualité (c’est-à-dire le taux de compression) de l’image. On part d’une qualité 100 (optimale) et on réduit jusqu’à obtenir la bonne taille de fichier. Si vous épluchez le script, vous verrez que la taille est calculée en sauvegardant temporairement dans un flux en mémoire (System.IO.MemoryStream) pour éviter de devoir écrire un fichier sur disque et en lire la taille à chaque itération de la boucle.
Quality
Permet de spécifier une qualité d’image, c’est-à-dire un taux de compression. Les valeurs possibles vont de 0 à 100, 0 pour une qualité minimale et 100 pour une qualité optimale.
Copy
Ce paramètre permet de préciser qu’on veut que l’image générée n’écrase pas l’image originale. La copie générée reprend le nom de l’image originale en y ajoutant des informations sur les modifications apportées.
En l’état actuel, ce script a quelques limitations qu’il faut connaître :
Mais assez blablaté, voici le script :
# set-imagesize.ps1
#
# Modifie la taille des images fournies en entrée
#
# Usage: ... | set-imagesize [-dim d | -ratio r | -width x -height y] [-size s | -quality q] [-copy]
#
# -dim indique la taille à appliquer à la plus grande dimension
# -ratio indique le ratio (1/r) à appliquer aux deux dimensions
# -width indique la largeur en pixels à appliquer
# -height indique la hauteur en pixels à appliquer
# -maxsize indique la taille maximum du fichier modifié
# -quality indique le taux de compression JPEG à utiliser
# -copy fait créer une copie au lieu de remplacer l'image originale
#
# Les images manipulées proviennent du pipeline. Le script agit comme un filtre et
# traite une à une les images transmises.
#
# La copie porte le nom de l'image originale suivi des informations sur
# le redimensionnement effectué. Par exemple, si un ratio de 1/10 est
# appliqué à portrait.jpg, la copie s'appellera portrait_r10.jpg.
#
# Si dim est spécifiée, un ratio correspondant est calculé et appliqué.
# Si ratio est spécifié, width et height sont ignorées.
# Si une seule des deux dimensions est spécifiée, l'autre est calculée en proportion.
#
# Si maxsize est spécifiée, le taux de compression optimal est calculé pour l'approcher.
# Dans ce cas, si un taux de compression est spécifié (quality), il est ignoré.
#
# Les images produites sont automatiquement converties au format JPEG.
#
# Exemple:
#
# dir *.jpg | set-imagesize -copy -dim 700 -max 98KB
#
param (
$dim = 0,
$ratio = 0,
$width = 0,
$height = 0,
$maxsize = 0,
[int64]$quality = 100,
[switch]$copy
)
[reflection.assembly]::LoadWithPartialName("system.drawing")>$null
if (!$ratio -and !$width -and !$height -and !$dim) {
$ratio = 1
}
$input | foreach {
$oldname = $_.name
$oldbasename = [IO.Path]::GetFileNameWithoutExtension($_)
$oldimage = new-object system.drawing.bitmap($_.fullname)
$newbasename = "$($oldbasename)_"
if ($dim) {
if ($oldimage.width -ge $oldimage.height) {
$ratio = $oldimage.width/$dim
}
else {
$ratio = $oldimage.height/$dim
}
}
if ($ratio) {
$width = $oldimage.width/$ratio
$height = $oldimage.height/$ratio
$newbasename += "R$([math]::round($ratio,1) -replace ',','.')"
}
else {
if ($width -or $height) {
if (!$width) {
$width = $oldimage.width/($oldimage.height/$height)
}
else {
$newbasename += "L$([math]::round($width))"
}
if (!$height) {
$height = $oldimage.height/($oldimage.width/$width)
}
else {
$newbasename += "H$([math]::round($height))"
}
}
}
$newimage = $oldimage.GetThumbnailImage($width, $height, $null, 0)
$oldimage.Dispose()
$newname = $oldname
$copy -and ($newname = $newbasename + $_.extension)>$null
$newpath = join-path (pwd).path $newname
$info = [System.Drawing.Imaging.ImageCodecInfo]::GetImageEncoders()
$params = new System.Drawing.Imaging.EncoderParameters(1)
$params.Param[0] = new System.Drawing.Imaging.EncoderParameter([System.Drawing.Imaging.Encoder]::Quality, $quality)
if ($maxsize) {
do {
$stream = new System.IO.MemoryStream
$newimage.Save($stream, $info[1], $params)
if ($stream.length -gt $maxsize) {
$quality--
$params.Param[0] = new System.Drawing.Imaging.EncoderParameter([System.Drawing.Imaging.Encoder]::Quality, $quality)
}
} while ($stream.length -gt $maxsize)
}
$newimage.Save($newpath, $info[1], $params)
$newimage.Dispose()
}
J’espère que ce script pourra vous être utile comme il l’est pour moi. Au passage, vous pourrez peut-être y trouver quelques astuces d’écriture de script mais ce serait tout à fait fortuit car ce n’est pas du tout l’objet de cet exercice.
Bon vent,
Janel March 16 Courir devant l'objectifAu gré de mes lectures je viens de découvrir le travail du photographe muggezifter. Vous ne le connaissez peut-être pas, il n’a certes pas le palmarès d’un David Hamilton, Helmut Newton ou encore la reconnaissance éternelle d’un Henri Cartier-Bresson, mais il a mis en ligne une série de photos sur le site Flickr qui, l’air de rien, fera sans doute date dans l’histoire de la photographie J. L’idée est archi-simple : le photographe pose son appareil quelque part, règle le retardateur sur 2 secondes et court devant l’objectif pour être le plus loin possible au moment du déclenchement. Voilà ce que ça donne, avec à l’heure actuelle 48 photos en ligne :
Au fil des photos on peut voir des commentaires élogieux et même quelques liens montrant que le photographe a fait des émules :
L’idée a fait son chemin, à tel point qu’un regroupement des séries autour du même thème existe :
L’épopée de notre héros a même fait l’objet d’un article dans la presse, en l’occurrence l’édition suisse alémanique de 20 minutes :
En voyant les premières photos je me suis demandé par quel miracle le photographe ne s’était pas fait dérober son équipement. En réalisant qu’il est Suisse, alémanique qui plus est, je comprends mieux… J
Janel |
|
|