Transformation : image => ascii art

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 / Exemple :


<?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);
?>

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.