note 19484 added to function.imagewbmp

From: Date: Thu, 28 Feb 2002 18:57:59 +0000
Subject: note 19484 added to function.imagewbmp
Groups: php.notes 
Request: Send a blank email to php-notes+get-27181@lists.php.net to get a copy of this message
As has been commented before, GD doesnt do a very good translation to 2-colours, especially for photos. The following routine converts to two colours, I believe using error diffusion (the algorithm's nicked off news). It's slow, but just about adequate for small images and low load. I suspect it can be made much more efficient :-) function ImageColorFloydSteinberg($dst_img, $src_img) { ImageColorAllocate($dst_img, 0,0,0); ImageColorAllocate($dst_img, 255,255,255); $grey_img = ImageCreate(ImageSX($src_img), ImageSY($src_img)); for ($a = 0; $a <= 255; $a++) ImageColorAllocate($grey_img, $a,$a,$a); for($x = 0; $x <= ImageSX($src_img); $x++) { for($y = 0; $y <= ImageSY($src_img); $y++) { $color = ImageColorsForIndex($src_img, ImageColorAt($src_img, $x, $y)); $greyscale = .299 * $color["red"] + .587 * $color["green"] + .114 * $color["blue"]; ImageSetPixel($grey_img, $x, $y, ImageColorClosest($grey_img, $greyscale, $greyscale, $greyscale)); } } for($x = 0; $x <= ImageSX($src_img); $x++) { for($y = 0; $y <= ImageSY($src_img); $y++) { $color = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x, $y)); if ($color["red"] > 128) { ImageSetPixel($dst_img, $x, $y, ImageColorClosest($dst_img,255,255,255)); $err = $color["red"] - 255; } else { ImageSetPixel($dst_img, $x, $y, ImageColorClosest($dst_img,0,0,0)); $err = $color["red"]; } if ($x != ImageSx($src_img)) { $color2 = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x+1, $y)); $newgrey = $color2["red"] + $err * 7 / 16; ImageSetPixel($grey_img, $x+1, $y, ImageColorClosest($grey_img,$newgrey, $newgrey, $newgrey)); } if ($x != 0) { $color2 = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x-1, $y)); $newgrey = $color2["red"] + $err * 3 / 16; ImageSetPixel($grey_img, $x-1, $y, ImageColorClosest($grey_img,$newgrey, $newgrey, $newgrey)); } if ($y != ImageSy($src_img)) { $color2 = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x, $y+1)); $newgrey = $color2["red"] + $err * 5 / 16; ImageSetPixel($grey_img, $x, $y+1, ImageColorClosest($grey_img,$newgrey, $newgrey, $newgrey)); } if ($x != ImageSx($src_img) && $y != ImageSy($src_img)) { $color2 = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x+1, $y+1)); $newgrey = $color2["red"] + $err / 16; ImageSetPixel($grey_img, $x+1, $y+1, ImageColorClosest($grey_img,$newgrey, $newgrey, $newgrey)); } } } imagedestroy($grey_img); } To output your WBMP, use ImageWBMP($final_img, "", ImageColorClosest(255,255,255)); -- http://www.php.net/manual/en/function.imagewbmp.php http://master.php.net/manage/user-notes.php?action=edit+19484 http://master.php.net/manage/user-notes.php?action=delete+19484 http://master.php.net/manage/user-notes.php?action=reject+19484

« previous php.notes (#27181) next »