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 ? 🙂

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Florian B.

Co-Fondateur d'IT-Connect, je souhaite partager mes connaissances et expériences avec vous, et comme la veille techno' est importante je partage aussi des actus.

florian has 2065 posts and counting.See all posts by florian

Laisser un commentaire

Votre adresse de messagerie 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.