- <?php
- function adaptiveThreshold($file){
- if(!$ex = getimagesize($file)){
- return false;
- }
- // 打开图片
- switch($ex[2]){
- case IMAGETYPE_JPEG:
- case IMAGETYPE_JPEG2000:
- if(!$im = imageCreateFromJpeg($file)){
- return false;
- }
- break;
- case IMAGETYPE_PNG:
- $im = imageCreateFromPng($file);
- break;
- case IMAGETYPE_GIF:
- $im = imageCreateFromGif($file);
- break;
- case IMAGETYPE_BMP:
- $im = imageCreateFromBmp($file);
- break;
- default :
- return false;
- }
- $gray = array_fill(0, $ex[1],
- array_fill(0, $ex[0], 0)
- );
- // 转为灰阶图像
- foreach($gray as $y => &$row){
- foreach($row as $x => &$Y){
- $rgb = imagecolorat($im, $x, $y);
- // 根据颜色求亮度
- $B = $rgb & 255;
- $G = ($rgb >> 8) & 255;
- $R = ($rgb >> 16) & 255;
- $Y = ($R * 19595 + $G * 38469 + $B * 7472) >> 16;
- }
- }
- unset($row, $Y);
- // 自动求域值
- $back = 127;
- do{
- $crux = $back;
- $s = $b = $l = $I = 0;
- foreach($gray as $row){
- foreach($row as $Y){
- if($Y < $crux){
- $s += $Y;
- $l++;
- }else{
- $b += $Y;
- $I++;
- }
- }
- }
- $s = $l ? floor($s / $l) : 0;
- $b = $I ? floor($b / $I) : 0;
- $back = ($s + $b) >> 1;
- }while($crux != $back);
- // 二值化
- $bin = $gray;
- foreach($bin as &$row){
- foreach($row as &$Y){
- $Y = $Y < $crux ? 0 : 1;
- }
- }
- return array(
- $gray,
- $bin,
- );
- }
- if(empty($_GET["img"])){
- exit("Please use $_SERVER[SCRIPT_NAME]?img=local/image/path");
- }
- if(!$im = adaptiveThreshold($_GET["img"])){
- exit("error!");
- }
- $img = imagecreate(count($im[0][0]), count($im[0]) * 2);
- $rgb = array(
- imagecolorallocate($img, 0, 0, 0),
- imagecolorallocate($img, 255, 255, 255),
- );
- $x = $y = 0;
- $colors = array(
- 0 => $rgb[0],
- 255 => $rgb[1]
- );
- foreach($im[0] as $row){
- do{
- if(isset($colors[$row[$x]])){
- $c = $colors[$row[$x]];
- }else{
- $c = $colors[$row[$x]] = imagecolorallocate($img, $row[$x], $row[$x], $row[$x]);
- }
- // imagesetpixel($img, $x, $y, $rgb[$row[$x] < 128 ? 0 : 1]);
- imagesetpixel($img, $x, $y, $c);
- }while(isset($row[++$x]));
- $x = 0;
- $y++;
- }
- foreach($im[1] as $row){
- do{
- imagesetpixel($img, $x, $y, $rgb[$row[$x]]);
- }while(isset($row[++$x]));
- $x = 0;
- $y++;
- }
- header("Content-Type: image/gif");
- imagegif($img);
- //该片段来自于http://www.codesnippet.cn/detail/1310201513793.html
来源: http://www.codesnippet.cn/detail/1310201513793.html