PHP实现图片转字符画

看到网上有其他人用Python,js实现的图片转字符画,挺有趣的,于是我尝试着用php实现了一个。

原理

图片转字符画本质上是将图片上的像素,根据其明暗程度的不同,选用不同的字符替换。其实现过程一般为

  • 设置一个像素块大小,然后选取每个像素块的代表像素
  • 依次获取每个像素块的RGB值,计算灰度值
  • 根据灰度值选择填充字符
  • 输出

实现

<?php
/*
*	功能:
*	由不同图片格式,获得图像资源并返回
*/
function getImg($imgName){
	$arr=getimagesize($imgName);
	if($arr[2]==1){
		return imagecreatefromgif($imgName);
	}else if($arr[2]==2){
		return imagecreatefromjpeg($imgName);
	}else if($arr[2]==3){
		return imagecreatefrompng($imgName);
	}else{
		echo "对不起,暂不支持该格式!";
	}
}

function output($imgName,$size="medium",$echoText="false"){
	/*
	*	参数说明:
	*	imageName	图像名称
	*	size		可选参数:low、medium、big 功能:控制输出不同的字符画大小
	*	echoText	功能:设置是否保存为txt文件
	*/

	$im = getImg($imgName);
	$output="";
	$str='@80GCLft1i;:,. ';	//填充字符

	//选取每个像素块的代表点。步长越大,图片越小
	switch($size){
		case "small":
			$stepx=8;
			$stepy=16;
			break;
		case "medium":
			$stepx=4;
			$stempy=8;
			break;
		case "big":
			$stepx=2;
			$stepy=4;
			break;
		default:
			$stepx=4;
			$stempy=8;
			break;
	}

	$x=imagesx($im);
	$y=imagesy($im);
	for($j=0;$j<$y;$j+=$stepy){
		for($i=0;$i<$x;$i+=$stepx){
			$colors=imagecolorsforindex($im,imagecolorat($im,$i,$j));	//获取像素块的代表点RGB信息
			$greyness=(0.3*$colors["red"]+0.59*$colors["green"]+0.11*$colors["blue"])/255;	//灰度值计算公式:Gray=R*0.3+G*0.59+B*0.11
			$offset=(int)ceil($greyness*(strlen($str)-1));	//根据灰度值选择合适的字符
			if($offset==(strlen($str)-1))
				$output.=" ";	//替换空格为 ;方便网页输出
			else
				$output.=$str[$offset];
		}
		$output.="<br/>";
	}

	imagedestroy($im);

	//输出到文本(可选)
	if($echoText){
		$output=str_replace("<br/>",PHP_EOL,$output);
		$output=str_replace(" "," ",$output);
		@unlink("output.txt");
		file_put_contents("output.txt",$output);
	}
        return $output;	//默认输出到网页
	}

//使用时直接调用output函数即可

        $res=output("test.jpg","small",false);
	echo "<div style='font-family:Consolas,Monaco,monospace;'>".$res."</div>";

代码阅读效果不佳?直接下载

说明

 

1.目前这个用php实现的图片转字符画函数支持gif,jpg,jpeg,png格式。新版的PHP7(>=7.2.0)还可以支持bmp格式,大家可以尝试自己添加。

2.当前此函数默认输出到网页上,也可以启用输出到文本功能。

3.填充字符的选择对输出效果有很大的影响,应当尽量使灰度高的像素对应间隙大的字符。

4.使用时只需调用output函数,并将图片文件放在同一级目录下即可。

附上一张效果图

在线图片转字符画:GO!

个人见解,如有错误,欢迎指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hober.z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值