PHP實現圖片轉字元畫

somehow1002發表於2017-08-26

看到網上有其他人用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!

個人見解,如有錯誤,歡迎指正。

相關文章