Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

TRANSFORMATION : IMAGE => ASCII ART


Information sur la source

Catégorie :Graphique Classé sous : ascii, art, image, transformation, couleurs Niveau : Initié Date de création : 27/11/2006 Vu / téléchargé: 12 233 / 614

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (5)
Ajouter un commentaire et/ou une note


Description

Ce code transforme l'image "img.jpg" en asciiart, la couleur de fond sur chaque caractère est la couleur moyenne du carré encodé, et le caractère est celui qui présente le plus fort contraste...
 

Source

  • <?php
  • function decompose($a){
  • $b=(int)$a/256/256;
  • $v=(int)$a/256%256;
  • $r=(int)$a%256;
  • return array($r, $v, $b);
  • }
  • function recompose($r, $v, $b){
  • return (($b*256+$v)*256+$r);
  • }
  • function colorfor($a, $x, $y, $nx, $ny, $alphabet){
  • $alphabetcouleursN=array();
  • $alphabetcouleursR=array();
  • $alphabetcouleursV=array();
  • $alphabetcouleursB=array();
  • $rm=0;
  • $vm=0;
  • $bm=0;
  • $n=0;
  • foreach($alphabet as $k=>$img){
  • $alphabetcouleursR[$k]=0;
  • $alphabetcouleursV[$k]=0;
  • $alphabetcouleursB[$k]=0;
  • $alphabetcouleursN[$k]=0;
  • }
  • for ($i=$x*$nx;$i<($x+1)*$nx;$i++){
  • for ($j=$y*$ny;$j<($y+1)*$ny;$j++){
  • list($r, $v, $b)=decompose(imagecolorat($a, $i,$j));
  • $rm+=$r;
  • $vm+=$v;
  • $bm+=$b;
  • $n++;
  • $px=$i-$x*$nx;
  • $py=$j-$y*$ny;
  • foreach($alphabet as $k=>$img){
  • if (!imagecolorat($img, $px, $py)){
  • $alphabetcouleursR[$k]+=$r;
  • $alphabetcouleursV[$k]+=$v;
  • $alphabetcouleursB[$k]+=$b;
  • $alphabetcouleursN[$k]++;
  • }
  • }
  • }
  • }
  • $rm=intval($rm/$n);
  • $vm=intval($vm/$n);
  • $bm=intval($bm/$n);
  • $car=-1;
  • $diff=0;
  • for($k=0;$k<sizeof($alphabet);$k++){
  • $alphabetcouleursR[$k]=intval($alphabetcouleursR[$k]/$alphabetcouleursN[$k]);
  • $alphabetcouleursV[$k]=intval($alphabetcouleursV[$k]/$alphabetcouleursN[$k]);
  • $alphabetcouleursB[$k]=intval($alphabetcouleursB[$k]/$alphabetcouleursN[$k]);
  • $d=abs($alphabetcouleursR[$k]-$rm)+
  • abs($alphabetcouleursV[$k]-$vm)+
  • abs($alphabetcouleursB[$k]-$bm);
  • if ($d>=$diff){
  • $diff=$d;
  • $car=$k;
  • }
  • }
  • $c1=recompose($rm, $vm, $bm);
  • $c2=recompose($alphabetcouleursR[$car], $alphabetcouleursV[$car], $alphabetcouleursB[$car]);
  • return array($c1, $c2, $car);
  • }
  • function tohex($a){
  • $hex='0123456789ABCDEF';
  • $C=$a%16;
  • $B=($a-$C)/16;
  • return ($hex{$B}.$hex{$C});
  • }
  • function color($a){
  • list($r, $v, $b)=decompose($a);
  • return '#'.tohex($b).tohex($v).tohex($r);
  • }
  • set_time_limit(0);
  • $npx=8;
  • $npy=15;
  • $alphabet=array();
  • //ici, si vous voulez plus de caractères possibles, il faut augmenter le nombre de caractères...
  • $alphabetstr='abcdefABCDEF0123456789-|`\_#"~@?,.;/:§!%*$&';
  • for ($i=0;$i<strlen($alphabetstr);$i++){
  • $alphabet[$i]=ImageCreateTrueColor($npx,$npy);
  • $back = ImageColorAllocate ($alphabet[$i], 200, 200, 200);
  • $for = ImageColorAllocate ($alphabet[$i], 0, 0, 0);
  • ImageFilledRectangle($alphabet[$i],0, 0,$npx, $npy,$back);
  • imagechar($alphabet[$i], 12, 0,0, $alphabetstr[$i],$for);
  • }
  • $a=ImageCreateFromJpeg('img.jpg');
  • $x=imagesX($a);
  • $y=imagesY($a);
  • $ncx=60;
  • $ncy=(int)$y*$ncx/$x*$npx/$npy;
  • $ny=$ncy*$npy;
  • $nx=$ncx*$npx;
  • $b=ImageCreateTrueColor($nx,$ny);
  • ImageCopyResized($b,$a,0,0,0,0,$nx,$ny,$x,$y);
  • imagedestroy($a);
  • echo '<table>';
  • for ($y=0;$y<$ncy-1;$y++){
  • echo '<tr>';
  • for ($x=0;$x<$ncx-1;$x++){
  • list($c1, $c2, $c3)=colorfor($b, $x, $y, $npx, $npy, $alphabet);
  • echo '<td style="background-color:'.color($c1).';color:'.color($c2).'">'.$alphabetstr{$c3}.'</td>';
  • flush();
  • }
  • echo '</tr>';
  • }
  • echo '</table>';
  • imagedestroy($b);
  • ?>
<?php
function decompose($a){
	$b=(int)$a/256/256;
	$v=(int)$a/256%256;
	$r=(int)$a%256;
	return array($r, $v, $b);
}
function recompose($r, $v, $b){
	return (($b*256+$v)*256+$r);
}
function colorfor($a, $x, $y, $nx, $ny, $alphabet){
	$alphabetcouleursN=array();
	$alphabetcouleursR=array();
	$alphabetcouleursV=array();
	$alphabetcouleursB=array();
	$rm=0;
	$vm=0;
	$bm=0;
	$n=0;
	foreach($alphabet as $k=>$img){
		$alphabetcouleursR[$k]=0;
		$alphabetcouleursV[$k]=0;
		$alphabetcouleursB[$k]=0;
		$alphabetcouleursN[$k]=0;
	}
	for ($i=$x*$nx;$i<($x+1)*$nx;$i++){
		for ($j=$y*$ny;$j<($y+1)*$ny;$j++){
			list($r, $v, $b)=decompose(imagecolorat($a, $i,$j));
			$rm+=$r;
			$vm+=$v;
			$bm+=$b;
			$n++;
			$px=$i-$x*$nx;
			$py=$j-$y*$ny;
			foreach($alphabet as $k=>$img){
				if (!imagecolorat($img, $px, $py)){
					$alphabetcouleursR[$k]+=$r;
					$alphabetcouleursV[$k]+=$v;
					$alphabetcouleursB[$k]+=$b;
					$alphabetcouleursN[$k]++;
				}
			}
		}
	}
	$rm=intval($rm/$n);
	$vm=intval($vm/$n);
	$bm=intval($bm/$n);
	$car=-1;
	$diff=0;
	for($k=0;$k<sizeof($alphabet);$k++){
		$alphabetcouleursR[$k]=intval($alphabetcouleursR[$k]/$alphabetcouleursN[$k]);
		$alphabetcouleursV[$k]=intval($alphabetcouleursV[$k]/$alphabetcouleursN[$k]);
		$alphabetcouleursB[$k]=intval($alphabetcouleursB[$k]/$alphabetcouleursN[$k]);
		$d=abs($alphabetcouleursR[$k]-$rm)+
			abs($alphabetcouleursV[$k]-$vm)+
			abs($alphabetcouleursB[$k]-$bm);
		if ($d>=$diff){
			$diff=$d;
			$car=$k;
		}
	}
	$c1=recompose($rm, $vm, $bm);
	$c2=recompose($alphabetcouleursR[$car], $alphabetcouleursV[$car], $alphabetcouleursB[$car]);
	return array($c1, $c2, $car);
}

function tohex($a){
	$hex='0123456789ABCDEF';
	$C=$a%16;
	$B=($a-$C)/16;
	return ($hex{$B}.$hex{$C});
}

function color($a){
	list($r, $v, $b)=decompose($a);
	return '#'.tohex($b).tohex($v).tohex($r);
}

set_time_limit(0);

$npx=8;
$npy=15;


$alphabet=array();
//ici, si vous voulez plus de caractères possibles, il faut augmenter le nombre de caractères...
$alphabetstr='abcdefABCDEF0123456789-|`\_#"~@?,.;/:§!%*$&';
for ($i=0;$i<strlen($alphabetstr);$i++){
	$alphabet[$i]=ImageCreateTrueColor($npx,$npy);
	$back = ImageColorAllocate ($alphabet[$i], 200, 200, 200);
	$for = ImageColorAllocate ($alphabet[$i], 0, 0, 0);
	ImageFilledRectangle($alphabet[$i],0, 0,$npx, $npy,$back);
	imagechar($alphabet[$i], 12, 0,0, $alphabetstr[$i],$for);
}

$a=ImageCreateFromJpeg('img.jpg');
$x=imagesX($a);
$y=imagesY($a);

$ncx=60;
$ncy=(int)$y*$ncx/$x*$npx/$npy;

$ny=$ncy*$npy;
$nx=$ncx*$npx;
$b=ImageCreateTrueColor($nx,$ny);
ImageCopyResized($b,$a,0,0,0,0,$nx,$ny,$x,$y);
imagedestroy($a);


echo '<table>';
for ($y=0;$y<$ncy-1;$y++){
	echo '<tr>';
	for ($x=0;$x<$ncx-1;$x++){
		list($c1, $c2, $c3)=colorfor($b, $x, $y, $npx, $npy, $alphabet);
		echo '<td style="background-color:'.color($c1).';color:'.color($c2).'">'.$alphabetstr{$c3}.'</td>';
		flush();
	}
	echo '</tr>';
}
echo '</table>';
imagedestroy($b);
?>

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de malalam le 27/11/2006 10:43:44 administrateur CS

Hello Coucou,

très amusant et sympa :-)
Pour coller plus à l'esprit ascii art, je proposerais même une version en dégradés de gris, si j'étais toi.

signaler à un administrateur
Commentaire de econs le 27/11/2006 11:00:23 administrateur CS

Salut,
Un petit peu long à l'exécution sur mon poste (image de 12Ko). Mais le résultat vaut bien d'attendre 4 secondes.
Sympa également pour la pixelisation d'images.

signaler à un administrateur
Commentaire de opossum_farceur le 28/11/2006 00:36:12

Salut coucou747
90 secondes pour afficher une image de 60x60 pixels et de 1,6 KB (il s'agit en fait ton "avatar")!
Mon pc n'est pas de première jeunesse, mais quand même!
Bien que je ne sois pas sûr que ton script s'exécute correctement chez moi (par exemple certains caractères de l'"alphabet" ne s'affichent pas d'une couleur qui permette de les différencier du fond : est-ce normal?), ce qui est certain, c'est qu'il gagnerait à être optimisé.

Sur la forme,
passons vite fait sur les divisions et les multiplications par des puissances de 2 que l'on peut optimiser par des décalages avec >> et <<,
l'appel à ta fonction color() (qui fait elle appel aux fonctions decompose() et tohex()!) peut être remplacé
sans état d'âme par celui de la fonction sprintf(), certainement plus optimisée (un grand merci en passant
aux inventeurs du langage C).
ex :
color($c1)
est équivalent à :
sprintf('#%06X',$c1)

Sur le fond,
la fonction colorfor($a,$x,$y,$nx,$ny,$alphabet), qui calcule, en faisant des moyennes, la couleur pour chaque cellule de ton tableau html, est-ce qu'on obtiendrait pas la même chose en réduisant l'image, avec imagecopyresized(), directement aux dimensions $ncx et $ncy ? (et après on prendrait la couleur de chacun de ses pixels pour la reporter dans le tableau?).
Amicalement.

signaler à un administrateur
Commentaire de coucou747 le 28/11/2006 16:16:05

sprintf est lent... en C du moins... pour le redimentionnement, c'est aussi lent... bref, j'aime bien ma méthode, et si elle est lente, c'est que le calcul l'est :)

signaler à un administrateur
Commentaire de opossum_farceur le 28/11/2006 21:07:27

Salut coucou747,
sprintf() est certes lent, mais toujours plus rapide (à peu près 3 fois plus rapide) que ta combinaison color()=decompose()+tohex(), c'est le résultat d'un "bench" des plus basique que j'ai effectué sur 100000 itérations.
Amicalement.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Conversion image en couleurs données [ par matique ] Bonjour, Je souaiterais convertir une image en restreignant sa palette de couleurs à une palette de couleurs que j'ai definit. Par exemple : j'ai un Transformation de Ascii en caractère [ par Noizet ] Hello,Est-ce qu'il existe une fonction qui transforme mon code ascii en caractère?Merci"NoiZet" faire mesure sur image [ par alex7887 ] bonjour.j'ai un probleme je dois crée un module en php,qui doit permettre de faire des mesures de distance et angle sur une image GIF.auriez vous une Retour a la ligne et écriture [ par DjChat ] bonjour a tous, j'ai fait un script d'upload d'image et j'ai besoin qu'une fois qu'elle est uploder il m'ecrive dans un fichier texte images/le nom de Afficher une bourdure autour d'une zonnemap (image cliquable) [ par CoinCoin39FRFedora ] Le canard linuxien , ex-windosien se faisant massacrer sur Urban Terror sous le pseudonyme CoinCoin39[FR]Fedora Probleme de caractere dans BDD [ par DjChat ] Bonjour a tous j'ai crée un formulaire qui a des champ texte et qui une fois validée sont stocker dans une base de donnée MySQL, mais dès qu'il y a de écrire sur une image [ par slashf ] salut à mon problème est le suivant: je veux écrire sur une image un code qui serra généré en php pour cela y'a pas de souci j'ai bidouillé un program 2 questions qui pour moi sont un probleme [ par toutais ] bonjourvoici mes deux questions : Je tiens à  preciser que je suis un débutant ,je connais un peu le html et c est tout. Je suis pret à apprendre d au Recuperer valeur d'un input image... [ par DjChat ] Bonjour a tous, je suis entrain de crée un formulaire avec des images clickable, j'aurai voulu recuperé le nom de la personne a qui est la photo, donc Longueur de caractere dans un textarea [ par DjChat ] Bonjour a tous, j'ai un formulaire avec deux textarea et j'aimerai limiter le nombre de caractere a taper dans ces champ, j'me suis renseigner et c'es


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,577 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.