15/11/2024

PowerShell

Convertir une image en Art ASCII avec PowerShell

I. Présentation

Dans cet article, on se retrouve pour voir quelques choses de plutôt fun : la conversion de n'importe quelle image en Art ASCII, à l'aide de PowerShell.

Pour rappel, l'Art ASCII consiste à créer une image uniquement à l'aide des caractères (lettres et caractères spéciaux) contenus dans le code ASCII. Voici la fameuse table ASCII :

Source : Wikipédia

L'astuce pour le réaliser en PowerShell nous provient d'Idera et de la section "PowerTips. Nous allons voir ensemble comment utiliser la fonction fournie.

Code source : PowerTips

II. Convert-ImageToAsciiArt

La fonction se nomme "Convert-ImageToAsciiArt" et contient le code suivant :

 function Convert-ImageToAsciiArt
{
  param(
    [Parameter(Mandatory)][String]
    $Path,
    
    [ValidateRange(20,20000)]
    [int]$MaxWidth=80,
    
    # character height:width ratio
    [float]$ratio = 1.5
  )

  # load drawing functionality
  Add-Type -AssemblyName System.Drawing
  
  # characters from dark to light
  $characters = '$#H&@*+;:-,. '.ToCharArray()
  $c = $characters.count
  
  # load image and get image size
  $image = [Drawing.Image]::FromFile($path)
  [int]$maxheight = $image.Height / ($image.Width / $maxwidth)/ $ratio
  
  # paint image on a bitmap with the desired size
  $bitmap = new-object Drawing.Bitmap($image,$maxwidth,$maxheight)
  
  
  # use a string builder to store the characters
  [System.Text.StringBuilder]$sb = ""
  
  # take each pixel line...
  for ([int]$y=0; $y -lt $bitmap.Height; $y++){
    # take each pixel column...
    for ([int]$x=0; $x -lt $bitmap.Width; $x++){
      # examine pixel
      $color = $bitmap.GetPixel($x,$y)
      $brightness = $color.GetBrightness()
      # choose the character that best matches the
      # pixel brightness
      [int]$offset = [Math]::Floor($brightness*$c)
      $ch = $characters[$offset]
      if (-not $ch){ $ch = $characters[-1] }      
      # add character to line
      $null = $sb.Append($ch)
    }
    # add a new line
    $null = $sb.AppendLine()
  }

  # clean up and return string
  $image.Dispose()
  $sb.ToString()
}

Pour l'utiliser, c'est relativement simple, nous allons appeler la fonction :

$Path = "C:\TEMP\image-source.jpg"
$OutPath = "C:\TEMP\image-art-ascii.txt"

Convert-ImageToAsciiArt -Path $Path -MaxWidth 400 |
Set-Content -Path $OutPath -Encoding UTF8

Invoke-Item -Path $OutPath

Dans l'exemple ci-dessus, nous allons prendre le fichier "C:\TEMP\image-source.jpg" et créer le fichier "C:\TEMP\image-art-ascii.txt" en Art ASCII pour la sortie. Quant au paramètre MaxWidth, il sert à indiquer la largeur max du fichier de sortie.

Voilà le résultat, en vue dézoomé, ce qui donne l'impression d'avoir une photo alors qu'il s'agit d'un fichier texte uniquement avec des caractères ASCII (à droite, bien sûr) :

Plutôt cool, non ? 🙂

author avatar
Florian BURNEL Co-founder of IT-Connect
Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

1 commentaire sur “Convertir une image en Art ASCII avec PowerShell

  • Bonjour,
    Je voudrais essayer d’organiser des photos via powershell en utilisant la date de prise de vue.
    L’idée serais que Powershell crée des fichiers nommés par date de prise de vue des photos et classe chaque photo dans son dossier respectif.
    Est ce que cela semble faisable ?
    Merci beaucoup

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.