/** * Make the image greyscale * $rv = red value, defaults to 38 * $gv = green value, defaults to 36 * $bv = blue value, defaults to 26 * Based (more or less entirely, with changes for readability) on code from http://www.teckis.com/scriptix/thumbnails/teck.html */ function greyscale($rv = 38, $gv = 36, $bv = 26) { $width = $this->width; $height = $this->height; $newGD = imagecreatetruecolor($this->width, $this->height); $rt = $rv + $bv + $gv; $rr = $rv == 0 ? 0 : 1 / ($rt / $rv); $br = $bv == 0 ? 0 : 1 / ($rt / $bv); $gr = $gv == 0 ? 0 : 1 / ($rt / $gv); for ($dy = 0; $dy <= $height; $dy++) { for ($dx = 0; $dx <= $width; $dx++) { $pxrgb = imagecolorat($this->gd, $dx, $dy); $heightgb = ImageColorsforIndex($this->gd, $pxrgb); $newcol = $rr * $heightgb['red'] + $br * $heightgb['blue'] + $gr * $heightgb['green']; $setcol = ImageColorAllocate($newGD, $newcol, $newcol, $newcol); imagesetpixel($newGD, $dx, $dy, $setcol); } } // imagecopyresampled($newGD, $this->gd, 0,0, $srcX, $srcY, $width, $height, $srcWidth, $srcHeight); $output = new GD(); $output->setGD($newGD); if ($this->quality) { $output->setQuality($this->quality); } return $output; }