vendredi 19 octobre 2018

Réaliser une image ronde.

Je vais revenir un peu sur les graphismes dans cet article. Nous allons voir comment créer une image d'avatar tout ronde avec PowerShell. Dans l'exemple suivant, je crée une fenêtre transparente dans laquelle j'affiche une image toute ronde à partir d'un fichier contenant une image classique. Pour des raisons pratiques, j'ai ajouté une fonction "Escape" pour pouvoir sortir facilement du programme.


 
#Assembly.
[void][reflection.assembly]::LoadWithPartialName("System.Windows.Forms")
[void][reflection.assembly]::LoadWithPartialName("System.Drawing")

#Defini le chemin courant.
$curpath = ""
if ($psISE) { $curpath = Split-Path -parent $psISE.CurrentFile.Fullpath }
else        { $curpath = Split-Path $MyInvocation.MyCommand.Path }
 
#Ouvre une fenêtre transparente sans bord ni fond.
$formA = New-Object Windows.Forms.Form
$formA.StartPosition = [System.Windows.Forms.FormStartPosition]::CenterScreen
$formA.Size = New-Object System.Drawing.Size(100,100)
$formA.FormBorderStyle = "None"
$formA.TopMost = 1
$formA.BackColor = [System.Drawing.Color]::FromArgb(255,1,2,3)
$formA.TransparencyKey = [System.Drawing.Color]::FromArgb(255,1,2,3)

#Crée un contrôle image.
$imageA1 = New-Object System.Windows.Forms.pictureBox
$imageA1.Location = New-Object Drawing.Point 0,0
$imageA1.Size = New-Object System.Drawing.Size(60,60)

#Charge le fichier image à traiter.
#Il doit être au même endroit que le script.
#Notre fichier contient une image classique rectangulaire.
Try   { $file = New-Object System.Drawing.Bitmap($curpath+"\av.png") }
Catch { Exit }

#Créer un Bitmap.
#Correspond ici à une feuille vierge (transparente).
$cgdata = New-Object System.Drawing.Bitmap(60,60)

#Créer un objet Graphics.
#Cet objet nous permettra de dessiner sur notre feuille.
$graphic = [System.Drawing.Graphics]::FromImage($cgdata)

#Nous allons redimensionné l'image.
#Pour obtenir une meilleur qualité, nous allons utiliser l'option suivante.
$graphic.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::HighQualityBicubic

#Nous allons maintenant définir une zone de dessin sur notre feuille.
#Ici, ma zone est un cercle de 60px sur 60px. Une fois appliqué, seule
#la zones définit sera dessinable. Rien ne sera modifié en dehors de la zone.
$grpath = New-Object System.Drawing.Drawing2D.GraphicsPath(0)
$grpath.AddEllipse(0, 0, 60, 60)
$graphic.SetClip($grpath)

#Copie l'image ac.png dans la zone dessinable sur la feuille.
#J'utilise ici DrawImage pour forcer le redimensionnement
#de l'image à la taille de ma feuille.
$graphic.DrawImage($file, 0, 0, 60, 60)
        
#Puis j'applique le dessin obtenu au contrôle image.
$imageA1.Image = $cgdata
$graphic.Dispose()

#Fermer la fenêtre lorsque l'on appuie sur la touche "Escape".
$formA.add_KeyDown({ If ($_.KeyCode -eq "Escape") { $formA.Close() } })

#Attache les contrôles à la fenêtre.
$formA.controls.add($labelA1)
$formA.controls.add($imageA1)

#Affiche le tout.
[void]$formA.ShowDialog()