PHP将彩色照片变成灰色支持保留透明部分

这段时间超级忙,以至于好久都没写技术方面的笔记了。刚好最近在项目中需要对图像进行灰度处理,就是将彩色的图像变成灰色,因此研究了一下并在菠菜园记录下整个过程。

常见的图像格式有GIF、JPG、PNG、WMP等,在最初的时候我很自然的想到采用像素扫描的方法对图像进行精细处理,但最终结果却差强人意。以至于图像处理完了,图像中透明的部分没有办法解决。因为PHP读入图像的像素后透明部分的RGB数据为[255,255,255]。

百度了一下发现遇到这个问题的人很多,就是图像处理时容易把透明的像素点赋予白色或黑色的Color。所幸的是经过研究最终达到了想要的预期效果,现将PHP使图像变灰的函数分享如下。

PHP图像变灰色函数:

  1. /**
  2.      * PNG图像变灰
  3.      * @param $img string 文件路径
  4.      * @param bool $Base64
  5.      * @return string
  6.      */
  7.     public static function imgToGray($img,$Base64 = false){
  8.         list($width,$height,$type) = getimagesize($img);
  9.         switch ($type){
  10.             case 1:
  11.                 $image = imagecreatefromgif($img);
  12.                 $imgExt = ".gif";
  13.                 break;
  14.             case 2:
  15.                 $image = imagecreatefromjpeg($img);
  16.                 $imgExt = ".jpg";
  17.                 break;
  18.             case 3:
  19.             default:
  20.                 $image = imagecreatefrompng($img);
  21.                 $imgExt = ".png";
  22.                 break;
  23.         }
  24.         $file_temp_path = ROOT_PATH.DS."static".DS."upload".DS."imgTempPath";
  25.         if(!is_dir($file_temp_path)){
  26.             mkdir($file_temp_path,0777,true);
  27.         }
  28.         $filename = pathinfo($img);
  29.         imagealphablending($image, false);
  30.         imagesavealpha($image, true);
  31.         imagefilter($image,IMG_FILTER_GRAYSCALE);
  32.         imagepng($image,$file_temp_path.DS.$filename['filename'].$imgExt);
  33.         imagedestroy($image);
  34.         if($Base64){
  35.             $data = self::imgToBase64($file_temp_path.DS.$filename['filename'].".png");
  36.             @unlink($file_temp_path.DS.$filename['filename'].".png");
  37.             return $data;
  38.         }
  39.         return DS."static".DS."upload".DS."imgTempPath".DS.$filename['filename'].".png";
  40.     }

上述代码简单易懂,其中用到了一个imgToBase64将图像转换成base64的函数,这个需要自己补充。根据第二个参数可以选择保存成图像文件还是返回Base64。

为了便于保留图像的透明部分像素,输出文件一律为PNG格式。如果需要其他格式可以根据图像Type值分别处理。

看下我测试的效果吧。这里我用了一个项目中的图标进行了简单测试。

PHP将彩色照片变成灰色

 

你想把广告放到这里吗?

发表评论

您必须 登录 才能发表留言!