HomeCuriositàPHP Divertirsi con l'ASCII art

PHP Divertirsi con l’ASCII art

E’ difficile che non abbiate mai sentito parlare dell’ASCII Art; più probabile il logo di php in ASCII Artinvece è che nel trovarvela davanti non vi sia sovvenuta la denominazione esatta per essa. L’ASCII Art è quella tecnica che consiste nella riproduzione di immagini, mediante l’uso esclusivo di caratteri (ASCII).

Il tutto pare aver preso le mosse dalla più remota KEYBOARD art, che

Un articolo in cui si parla della keyboard art

consentiva di produrre dei disegni con la semplice macchina da scrivere, di cui si legge su una rivista specializzata nel 1948(se ne parla in questa pagina).

Sorprendente è il fatto che  nel 1968, a dispetto delle scarsissime risorse,  il russo Konstantinov, fu in grado di produrre un filmato di animazione con questa tecnica.

http://www.youtube.com/watch?v=0O4mm3hXNgA&playnext=1&list=PLDC168A3B475BD02D

Per noi, oggi è decisamente più facile:  esistono dei programmi che includono la possibilità di riprodurre video proprio sotto forma di ASCII Art,  grazie ad alcune librerie, tra cui la AAlib (qua è spiegato come usarla con mplayer) in barba alle settimane che che certamente avranno impiegato i poveri russi per la loro gattina.

In molti si sono appassionati al fenomeno ASCII Art, tra addetti ai lavori e non.

In ASCII Art, è stata realizzata una versione di un episodio di STAR WARS, ma anche più di recente il video del brano “black tambourine”, di Beck.

Il programma di grafica Gimp consente di salvare in questo formato, ed esistono tutta una serie di librerie e di script, che consentono di “goderne” da shell, o anche sul Web. Questo link offre un ottimo esempio di conversione.

E’ di uno script del genere che vi parlerò oggi.

Per prima cosa vi incollo il codice, cosicchè lo possiate copiare ed eseguire (l’unico parametro da impostare, sul finale, è il percorso del file) il tutto.  Questa che vi propongo è una versione evoluta, capace di riprodurre anche i colori, e che utilizzando caratteri più piccoli, è capace di fornire un output a risoluzione più alta.

[spoiler show=”Mostra cdice php” hide=”Nascondi codice php”]

<?php
/**********Image to ASCII
** Author.: leapinglangoor [ [email protected] ]
** Date…: 12th Dec 2004
** ver….: v1.00
**
** desc…: Send an argument $filename and  $dir
** The image can be png, jpeg or gif only.
** Use filename such as some.jpeg, langoors.gif, xhtml.png
** $dir – The path of the directory where the image is located
**
************************************************/

function ascii( $filename, $dir )
{
$name = basename( $filename );
$file = $dir . $name;

if( file_exists( $file ) )
{
$what = getimagesize( $file );

switch( $what[‘mime’] )
{
case ‘image/png’ : $src_id = imagecreatefrompng( $file );
break;
case ‘image/jpeg’: $src_id = imagecreatefromjpeg( $file );
break;
case ‘image/gif’ : $old_id = imagecreatefromgif( $file );
$src_id = imagecreatetruecolor( $what[0],$what[1]);
imagecopy( $src_id, $old_id, 0, 0, 0, 0, $what[0], $what[1] );
break;
default: break;
}

else
{
die( ‘No such file’ );
}

if( $src_id )
{

$x_size = imagesx( $src_id );
$y_size = imagesy( $src_id );

// if it really read each pixel, it’d be too slow and heavy. so, here we determine
// how many pixels the script must ‘jump’ each loop. tip: y jump must be greater
// than the x jump, to decrease the distorcion.
$x_jump = 2;
$y_jump = 3;

// char/strings that will construct the image. it’s randomly selected after,
// in the loop. a value in the array will be one pixel in the asci-image.
$pixel_char = array(0);

echo “The image is $x_size x $y_size\n”;

echo “<span style=’font-size:6px; font-weight:bold;’>”;
echo “<pre>”;
// now it has a ‘nested loop’ to read ‘each’ pixel and print it
for( $y = 0; $y < $y_size; $y+=$y_jump )
{

for( $x = 0; $x < $x_size; $x+=$x_jump )
{

if( $x >= $x_size || $y >= $y_size ) break;

$rgb = @imagecolorat($src_id, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;

if( $x >= $x_size )
{
break;
}

if( $y >= $y_size )
{
break;
}

$pc = ‘WM’;

echo “<font style=’color:rgb($r,$g,$b)’>WM</font>”;

} // end of ‘x’ loop

echo “\r\n”; // end of a line

} // end of ‘y’ loop
echo “</pre></span>”; // close opened tags

} // end if( $src_id )

} //end function ascii
?>

Esempio di uso
<?php
$image = ‘immaginedaconvertire.jpg’;#il nome dell’immagine
$dir = ‘./’;#qua indicate la directory, se diversa dall’ubicazione del file
ascii( $image, $dir );  // The ascii will be output by itself
?>

[/spoiler]

Questo codice, sfruttando le librerie GD, ridisegna le vostre immagini a colori ed è una combinazione di funzioni PHP, che vengono eseguite mediante due cicli innestati.

Si parte con l’analisi del formato sottoposto ed in base all’esito, viene invocata la fuzione più appropriata tra quelle dedicate al ricalco (imagecreatefromjpg/png/gif…) , grazie ad uno switch.

Si continua con la scansione dell’immagine appena creata, con la funzione imagecolorat, che funziona come il classico  “preleva colore” degli editor grafici le cui coordinate (x,y) spaziali vengono incrementate ad ogni ciclo, secondo un parametro che ne alleggerisce l’intervento, chiamato “jump”, il quale determina l’ampiezza dell’area minima da analizzare.

Il risultato dell’analisi è il codice del colore (rgb), e viene fornito ai parametri di formattazione (lo stile in linea) applicati  ai singoli caratteri in fase di stampa a video.

La versione tradizionale (in bianco e nero) è invece ottenibile mediante quest’altro script (fonte: tuxradar).

[spoiler show=”Mostra cdice php” hide=”Nascondi codice php”]

<?php
$image = imagecreatefromjpeg(“immaginedamostrare.jpg”);#impostare il path dell’immagine qui
if ($image) {
echo ‘<PRE STYLE=”font: 1px/1px Courier New;”>’;
$asciichars = array(“@”, “#”, “+”, “*”, “;”, “:”, “,”, “.”, “`”, ” “);
$width = imagesx($image);
$height = imagesy($image);for($y = 0; $y < $height; ++$y) {
for($x = 0; $x < $width; ++$x) {
$thiscol = imagecolorat($image, $x, $y);
$rgb = imagecolorsforindex($image, $thiscol);
$brightness = $rgb[‘red’] + $rgb[‘green’] + $rgb[‘blue’];
$brightness = round($brightness / 85);
$char = $asciichars[$brightness];
echo $char;
}
echo “\n”;
}
echo ‘</PRE>’;
}
?>

[/spoiler]

Buon divertimento!!!

 

 

 

Luigi Lacquaniti
Luigi Lacquaniti
Tecnico e Web designer freelance.

Ultime dal Blog