dimanche 18 janvier 2009

Petit délire d'ASCII art

Salut, salut !
Histoire de poster un truc pour vous montrer que le blog n'est pas encore mort, je vais vous parler d'un petit script à la con que j'ai fait hier en même pas 15 minutes. Ca m'a permis de pratiquer un peu la bibliothèque GD de php.

Je préviens, au passage, que je vois déjà ma monture - UnKnOwN*DrAgOoN - se foutre de ma gueule. :]

Le script a pour fonction de prendre quatre arguments en méthode GET :
- La skin a afficher en ascii art ;
- la couleur de fond sur laquelle afficher l'ascii art ;
- les coordonnées x de la frame ;
- les coordonnées y de la frame.

Imaginez la skin suivante :


Le but du script serait de prendre une frame (celle de face, par exemple) et de l'afficher en ascii art avec les couleurs. On imagine donc bien l'algorithme qui :
- se positionne au 1er pixel de la frame ;
- lit, de façon séquentielle, la couleur des pixels ;
- affiche des caractères HTML colorés.

J'ai donc déjà au moins ça :
<?php
if(!empty($_GET['bgcolor'])) {
$colordefault = "#".htmlentities($_GET['bgcolor']);
} else {
$colordefault = "#000000";
}
echo
"<body bgcolor=\"".$colordefault."\" text=\"#FFFFFF\">";



J'avoue que ça doit pas être très optimisé niveau sécu' ou quoi, mais c'est juste que, sur le moment, je me faisais chier comme pas possible.

Ensuite, sachant qu'une frame fait 24 pixels sur la largeur et 32 pixels sur la longueur, on peut continuer là-dessus :
if(isset($_GET['skin'])) {
$MyImage = @imagecreatefrompng($_GET['skin']);

if(isset($_GET['x'])) {
$framex = abs(intval($_GET['x']));
} else {
$framex = 0;
}

if(isset($_GET['y'])) {
$framey = abs(intval($_GET['y']));
} else {
$framey = 0;
}

$debutx = 24*$framex;
$debuty = 32*$framey;

$dest = imagecreatetruecolor(24,32);
imagecopymerge($dest, $MyImage, 0, 0, $debutx, $debuty, 24, 32, 100);
// ...



On créer une petite image de destination aux dimensions 24x32 et on y copie la frame à afficher. C'est inutile mais ça m'a permis de faire du pas à pas.

Voici en suite la portion de code qui servirait à afficher l'ascii art coloré :
echo "<font size=\"1\" face=\"Courier New\">";
for($j = 0; $j <= 32; $j++) {
for($i = 0; $i <= 24; $i++) {
$color = imagecolorat($dest,$i,$j);
$r = ($color >> 16) & 0xFF;
$g = ($color >> 8) & 0xFF;
$b = $color & 0xFF;
if($color) {
echo "<font color=\"#".
($r <= 15 ? "0".dechex($r) : dechex($r)).
($g <= 15 ? "0".dechex($g) : dechex($g)).
($b <= 15 ? "0".dechex($b) : dechex($b))."\">0101</font>";
} else {
echo "<font color=".$colordefault.">0101</font>";
}
}
echo "<br />";
for($i = 0; $i <= 24; $i++) {
$color = imagecolorat($dest,$i,$j);
$r = ($color >> 16) & 0xFF;
$g = ($color >> 8) & 0xFF;
$b = $color & 0xFF;
if($color) {
echo "<font color=\"#".
($r <= 15 ? "0".dechex($r) : dechex($r)).
($g <= 15 ? "0".dechex($g) : dechex($g)).
($b <= 15 ? "0".dechex($b) : dechex($b))."\">0101</font>";
} else {
echo "<font color=".$colordefault.">0101</font>";
}
}
echo "<br />";
}
echo "</font>";



Petites explications : On balaye chaque ligne, on lit la couleur des pixels et on l'affiche en <font color="couleur lue">ascii art</font>. Si je fais deux boucles for() sur la largeur, c'est pour éviter que l'ascii art soit trop tassé.

On peut terminer avec une petite notice d'utilisation - flemme d'avoir codé un formulaire html...
} else {
echo "<pre>Utilisation : script.php?skin=skin.png[&bgcolor=couleur_hexa][&x=valeur][&y=valeur]</pre>";
}
?>


Comme quoi, c'est juste pour le délire que j'ai fait ça.
Un petit aperçu ? :]

hebergé sur tof.center.free.fr


Voili voulou. Et, vu que j'aurais pas écrit beaucoup de choses, autant publier mes résultats merdiques du BTS blanc :
- Droit : 4,25 ;
- Economie : 8,5 ;
- Comptabilité : 8,5 ;
- Architecture matérielle : 9 ;
- Français : 10,7 ;
- Anglais : 12 ;
- Analyse (Méthode merise) : 13,5 ;
- Architecture logicielle (SQL, excel...) : 16,5 ;
- Algorithmie : 18,5 ;
- Maths : 18,5 ;
- GEOSI (Gestion des entreprise et organisation des systèmes d'information) : 20,5, car, en fait, la notation a été revue pour être sur 23. Ca me fait 0.5 point de bonus.

Ca me fait une moyenne de merde, les matières informatiques étant regroupées dans un coefficient global de 5. L'éco-droit, coeff 3 (Aïe !), et tout le reste coeff 2.

C'était... ma vie passionnante ! C'est bien la dernière fois que je dis des trucs qui n'ont rien à voir avec le blog...

Conclusion ?


Pour en revenir au sujet de l'article, celui-ci ne sert un peu à rien comparé aux autres - sh4ka m'a même dit qu'il préférait la crypto. Néanmoins, c'est toujours ça de plus de coder des petits trucs pour en tirer une petite satisfaction. Je sais pas pour vous, mais, ça m'a fait délirer de faire de l'ascii art (premier truc que j'ai fait).

Geo


PS : Ajout de kmkz dans la liste des copains. Blog sympathique (comme les autres) à aller voir !
PS2 : Ajout du site de shp - mon sacalain, ma propriété privée - dans la liste des copains. Je t'aime, mon bichon.
PS3 : Ajout du blog de 5m0k3, mon prédécesseur, dans la liste des copains.