PHP:将 png 和 gif 转换为灰度

Posted

技术标签:

【中文标题】PHP:将 png 和 gif 转换为灰度【英文标题】:PHP: Converting png's and gif's into grayscale 【发布时间】: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 中的透明度会变成黑色。

有什么想法吗?

【问题讨论】:

【参考方案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('/\.(\w3,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 


?>

【讨论】:

以上是关于PHP:将 png 和 gif 转换为灰度的主要内容,如果未能解决你的问题,请参考以下文章

如何将多个 PNG 文件转换为动画 GIF? [关闭]

如何使用 PHP 冻结动画 gifs/转换为 jpg?

Julia:将 GIF 帧转换为 PNG

开源项目将图片转换为字符画

使用 ImageMagick 将 gif 转换为 png 时出现“转换:不正确的图像标题”错误

Python:将 GIF 帧转换为 PNG