2010-01-26 137 views
2

即時通訊使用以下腳本將jpgs轉換爲灰度圖像。 http://bubble.ro/How_to_convert_an_image_to_grayscale_using_PHP.htmlPHP:將png和gif轉換爲灰度

我想升級它也將pngs(帶有透明度)和gif(帶有透明度)轉換爲灰度圖像。

目前它不工作。我正在查詢其文件擴展名的image-src。如果jpg,if,gif或者png我稱之爲合適imagecreatefrom-jpg-gif-png

但是我總是運行相同的for-loop和gifs,不幸的是只能得到灰色的矩形,每個像素都是灰色的。 Png幾乎可以工作,但是PNG的透明度會變成黑色。

任何想法?

回答

1
$image = ImageCreateFromString(file_get_contents('/path/to/image.ext')); 

ImageFilter($image, IMG_FILTER_GRAYSCALE); 

ImageGIF($image); // or ImagePNG($image); 
3

使用此發現這裏 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); } 

*/ 
0

謝謝!

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 { 
} 

?> 
1

要獲得正確的畫面無黑的背景,你必須遵循的策略:

首先創建新的圖像項目 設置它的alphablending假 設置它的savealpha真 FIL它與透明矩形 複製你變灰的圖片在它

您的代碼將與此類似:

 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; 
     } 

goodluck!


看看我balda pomoshnik