【问题标题】:PHP: Converting png's and gif's into grayscalePHP:将 png 和 gif 转换为灰度
【发布时间】:2011-01-09 16:37:21
【问题描述】:

我使用以下脚本将 jpg 转换为灰度图像。 http://bubble.ro/How_to_convert_an_image_to_grayscale_using_PHP.html

我想升级它以将 png(透明)和 gif(透明)转换为灰度图像。

目前它不起作用。我正在查询 image-src 的文件扩展名。如果是 jpg、if、gif 或 png,我会调用相应的 imagecreatefrom-jpg-gif-png

但是我总是运行相同的 for 循环,不幸的是 gif 只得到灰色矩形,每个像素都是灰色的。 Png 几乎可以工作,但是 png 中的透明度会变成黑色。

有什么想法吗?

【问题讨论】:

    标签: php png jpeg gif grayscale


    【解决方案1】:

    使用这里找到的 http://hm2k.googlecode.com/svn/trunk/code/php/functions/imagegray.php

    <?php
    
    function imagegray($img) {
      if (!file_exists($img)) { user_error("'$img' file was not found."); return; }
      list($width, $height, $type) = getimagesize($img);
      switch ($type) {
        case 1:
        $img = imagecreatefromgif($img);
        break;
        case 2:
        $img = imagecreatefromjpeg($img);
        break;
        case 3:
        default:
        $img = imagecreatefrompng($img);
        break;
      }
      imagefilter($img, IMG_FILTER_GRAYSCALE);
      header('Content-type: image/png');
      imagepng($img);
      imagedestroy($img);
    }
    
    /*because i'm british*/
    function imagegrey($img) {
      return imagegray($img);
    }
    
    /*
    
    //example usage
    
    $i=isset($_REQUEST['i'])?$_REQUEST['i']:'';
    if ($i) { imagegrey($i); }
    
    */
    

    【讨论】:

      【解决方案2】:
      $image = ImageCreateFromString(file_get_contents('/path/to/image.ext'));
      
      ImageFilter($image, IMG_FILTER_GRAYSCALE);
      
      ImageGIF($image); // or ImagePNG($image);
      

      【讨论】:

        【解决方案3】:

        要获得没有黑色背景的正确图片,您必须遵循以下策略:

        首先创建您的新图像项 将它的 alphablending 设置为 false 将它的 savealpha 设置为 true 用透明矩形填充它 将你的灰色图片复制到上面

        您的代码将与此类似:

                switch ($handle->file_src_name_ext) {
                  case 'gif':
                    $sourceIm = imagecreatefromgif($savepath.$handle->file_dst_name);
                    break;
                  case 'jpg':
                    $sourceIm = imagecreatefromjpeg($savepath.$handle->file_dst_name);
                    break;
                  case 'png':
                  default:
                    $sourceIm = imagecreatefrompng($savepath.$handle->file_dst_name);
                    break;
                }
        
        
                $iw = imagesx($sourceIm);
                $ih = imagesy($sourceIm);
        
                $im = imagecreatetruecolor($iw, $ih);
        
                if (function_exists('imagecolorallocatealpha')) {
                    imagealphablending($im, false);
                    imagesavealpha($im, true);
                    $transparent = imagecolorallocatealpha($im, 255, 255, 255, 127);
                    imagefilledrectangle($im, 0, 0, $iw, $ih, $transparent);
                }
                if ($sourceIm ) {
                  imagefilter($sourceIm, IMG_FILTER_GRAYSCALE);
                }
                imagecopyresampled($im, $sourceIm, 0, 0, 0, 0, $iw, $ih, $iw, $ih);
                switch ($handle->file_src_name_ext) {
                  case 'gif':
                    imagepng($im, $savepath.'grd'.$row->id.'.gif');
                    break;
                  case 'jpg':
                    imagejpeg($im, $savepath.'grd'.$row->id.'.jpg');
                    break;
                  case 'png':
                  default:
                    imagepng($im, $savepath.'grd'.$row->id.'.png');
                    break;
                }
        

        祝你好运!


        看看我的balda pomoshnik

        【讨论】:

          【解决方案4】:

          谢谢!

          imagefilter($img, IMG_FILTER_GRAYSCALE);

          它几乎可以工作了。我仍然有透明度问题。具有透明背景的 png 被转换为黑色(背景为黑色)。同样的情况也发生在 gif 上,而且具有透明度的 gif 没有得到正确的灰度。有一些非常灰调的颜色,但其中有淡绿色和红色。

          <?php                                                                       
          $src = $_GET['src'];
          
          $img_ext;
          if (preg_match('/\.(\w{3,4})$/i', $src, $reg)) {
              $img_ext = strtolower($reg[1]);
          }
          
          $source_file = $src;
          if ($img_ext == "jpg" || $img_ext == "jpeg") { //jpg
              $im = imagecreatefromjpeg($source_file);
          } else if ($img_ext == "gif") {
              $im = imagecreatefromgif($source_file); //gif
          } else if ($img_ext == "png") {
              $im = imagecreatefrompng($source_file); //png
          } else {
          }
          
          ImageFilter($im, IMG_FILTER_GRAYSCALE);
          
          
          if ($img_ext == "jpg" || $img_ext == "jpeg") { //jpg
              header('Content-type: image/jpeg');
              imagejpeg($im);
          } else if ($img_ext == "gif") { //gif
              header('Content-type: image/gif');
              imagegif($im);
          } else if ($img_ext == "png") { //png
              header('Content-type: image/png');
              imagepng($im);
          } else {
          }
          
          ?>
          

          【讨论】:

            猜你喜欢
            • 2014-06-20
            • 2013-06-05
            • 2018-04-28
            • 2020-01-07
            • 2013-09-05
            • 1970-01-01
            • 2023-03-23
            • 1970-01-01
            • 2012-01-22
            相关资源
            最近更新 更多