Home Curiosità 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
Web designer freelance.

LASCIA UN COMMENTO

Please enter your comment!
Please enter your name here

Ultime dal Blog

Netflix: ufficiale l’aumento dei prezzi sui piani Standard (HD) e Premium (UHD)

Era un rumors quasi certo, ed è stato alla fine ufficializzato: Netflix ha aumentato i prezzi su due dei tre piani sottoscrivibili. I piani Standard...

Google Maps: ora visibile anche il tachimetro mentre si guida

Da qualche settimana il famoso navigatore made in Google sta (finalmente) implementando delle funzioni prese in prestito dal suo fratellino Waze. Dopo aver visto...

Mounty: ed i dischi NTFS non sono più un tabù su MacOS

Chi possiede un Mac da diversi anni sa bene quanto sia poco intuitivo ed immediato poter scrivere su un disco esterno in formato NTFS. Il...

Tor Browser: la prima versione stabile è disponibile per Android

Tor, per chi non lo conoscesse, è un sistema di reti che permette di navigare nel web restando completamente anonimi e senza essere tracciati...

Share Mouse: controlla più computer usando un solo mouse

Oggi vi parleremo di Share Mouse, software veramente utile che vi permetterà di poter controllare più computer, usando un solo mouse e una sola...