【PNG】彩色轉灰階/黑白


【目的】

將彩色轉灰階/黑白。通常取黑白之前要先取灰階(RGB/3 大於7F為白,相反為黑)

【程式碼】

  1. 彩色轉灰階法一: rgb 三色取平均數
    <?php
    $img = imagecreatefrompng('lena_std.png');
    imageTrueColorToPalette($img,true,256);
    $numColors = imageColorsTotal($img);
    for ($x = 0; $x < $numColors; $x++)
      {
        list($r,$g,$b) = array_values(imageColorsForIndex($img,$x));
        $avg = intval(($r + $g + $b) / 3);
        imageColorSet($img,$x,$avg,$avg,$avg);
      }
    imagepng($img,'lena_gray.png');
    imagedestroy($img);
    ?>
  2. 彩色轉灰階法二: R*0.299 + G*0.587+B*0.114 
    <?php 
    $img = imagecreatefrompng('lena_std.png');
    imageTrueColorToPalette($img,true,256);
    $numColors = imageColorsTotal($img);
    for ($x = 0; $x < $numColors; $x++)
      {
        list($r,$g,$b) = array_values(imageColorsForIndex($img,$x));     
        $avg = intval($r*0.299 + $g*0.587 + $b*0.114);
    	imageColorSet($img,$x,$avg,$avg,$avg);
      }
    imagepng($img,'lena_gray.png');
    imagedestroy($img);
    ?>

  3. 彩色轉灰階法三: 直接使用GD內建的imagefilter(IMG_FILTER_GRAYSCALE)
    <?php 
    $im = imagecreatefrompng('lena_std.png'); 
    if($im && imagefilter($im, IMG_FILTER_GRAYSCALE)) 
    {     
      echo 'Image converted to grayscale.';     
      imagepng($im, 'lena_gray.png'); 
    } 
     else 
    {  
      echo 'Conversion to grayscale failed.'; 
    } 
    imagedestroy($im); 
    ?>
  4. 彩色轉單色法一:
    <?php
    $img = imagecreatefrompng('lena_std.png');
    imageTrueColorToPalette($img,true,256);
    $numColors = imageColorsTotal($img);
    for ($x = 0; $x < $numColors; $x++)
      {
        list($r,$g,$b) = array_values(imageColorsForIndex($img,$x));
        $avg = intval($r*0.299+$g*0.587+$b*0.114);
    	if($avg >= 127){ $avg = 255; }
    	else{$avg = 0;}
        imageColorSet($img,$x,$avg,$avg,$avg);
      }
    imagepng($img,'lena_bw.png');
    imagedestroy($img);
    ?>

【結果】

  1. 原始圖片(300x300 24bits lena_std.png)
    image
  2. 彩色轉灰階轉檔結果(300x300 8bits lena_gray.png)
    image
  3. 彩色轉單色結果(lena_bw.png)
    image

【參考】

【備註】

  • bool imagetruecolortopalette ( resource image, bool dither, int ncolors )
    第二個參數(true/false)為指明圖像是否被抖動(dithered)。
    第三個參數(2/4../256)為定調色板中被保留的顏色的最大數目。
 

Ed32. Copyright 2008 All Rights Reserved Revolution Two Church theme by Brian Gardner Converted into Blogger Template by Bloganol dot com