【目的】
將彩色轉灰階/黑白。通常取黑白之前要先取灰階(RGB/3 大於7F為白,相反為黑)
【程式碼】
- 彩色轉灰階法一: 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); ?>
- 彩色轉灰階法二: 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); ?>
- 彩色轉灰階法三: 直接使用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); ?>
- 彩色轉單色法一:
<?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); ?>
【結果】
【參考】
- 利用ASP.NET做Image processing,將彩色圖片變灰階圖片
http://blog.blueshop.com.tw/hent/archive/2008/03/31/54636.aspx - heavyraptor2 at hotmail dot com
http://www.php.net/manual/en/function.imagecolorset.php
【備註】
- bool imagetruecolortopalette ( resource image, bool dither, int ncolors )
第二個參數(true/false)為指明圖像是否被抖動(dithered)。
第三個參數(2/4../256)為定調色板中被保留的顏色的最大數目。