E’ difficile che non abbiate mai sentito parlare dell’ASCII Art; piรน probabile invece รจ 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
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.
** 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).
$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!!!