您的位置:首页 > 编程语言 > PHP开发

PHP实现图片转字符画

2017-08-26 11:59 465 查看
看到网上有其他人用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!

个人见解,如有错误,欢迎指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: