begin process at 2012 02 15 18:55:32
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Graphique

 > TRANSFORMATION : IMAGE => ASCII ART

TRANSFORMATION : IMAGE => ASCII ART


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Graphique Classé sous :ascii, art, image, transformation, couleurs Niveau :Initié Date de création :27/11/2006 Vu / téléchargé :15 481 / 667

Auteur : coucou747

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
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

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec une capture IMAGES GENETIQUES
Source avec Zip Source avec une capture RUBIX CUBE
Source avec Zip INTERPRETEUR BRAINFUCK
Source avec Zip PROXY HTTP : SAUVEZ VOS VIDEOS PREFEREES.
Source avec une capture ECRIRE UN TEXTE EN CERCLE SUR UNE IMAGE

 Sources de la même categorie

Source avec Zip Source avec une capture CAMEMBERT BD par dardelphi
Source avec une capture AMÉLIORATION : CAMEMBERT par asphator
GESTION DE COULEUR par manuche
Source avec Zip NAVIGATOR (+CSSDETECTOR) par xXVoxPopuliXx
COMMENT, AVEC GD, DESSINER UN RECTANGLE TRANSPARENT PLEIN AV... par Rainbow

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture GESTIONNAIRE DE NEWS BASIQUE AVEC UPLOAD D'IMAGES par cod57
Source avec Zip Source avec une capture UPLOADEUR DE FICHIERS MULTIPLES V1 par cod57
CLASS GALERIE PHOTO par Xiryl
CRÉER UNE IMAGE À PARTIR DU TEXTE par dilar
Source avec Zip Source avec une capture ASCIIART : PHP-CURSES par coucou747

Commentaires et avis

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.

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.

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.

Commentaire de coucou747 le 28/11/2006 16:16:05 administrateur CS

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 :)

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...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,546 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales