Fill an image with color with the defined sparse color method.
Barycentric - Maps three colors onto a linear triangle of color. The colors outside this triangle continue as before. This method is useful for creating smooth gradients of color.
Bilinear - This method fits an equation to 4 points, over all three color channels to produce a uniform color gradient between the points, and beyond.
Shepards - The "Shepards" method uses a ratio of the inverse squares of the distances to each of the given points to determine the color of the canvas at each point.
Voronoi - Maps each pixel in the image to the color of the closest point point provided. This basically divides the image into a set of polygonal 'cells' around each point.
http://www.imagemagick.org/Usage/canvas/#sparse-color
public function renderImageBarycentric2() { $points = [ [0.30, 0.10, 'red'], [0.10, 0.80, 'blue'], [0.70, 0.60, 'lime'], [0.80, 0.20, 'yellow'], ]; $imagick = createGradientImage( 400, 400, $points, \Imagick::SPARSECOLORMETHOD_BARYCENTRIC ); header("Content-Type: image/png"); echo $imagick->getImageBlob(); }
public function renderImageBilinear() { $points = [[0.30, 0.10, 'red'], [0.10, 0.80, 'blue'], [0.70, 0.60, 'lime'], [0.80, 0.20, 'yellow'],]; $imagick = createGradientImage(500, 500, $points, \Imagick::SPARSECOLORMETHOD_BILINEAR); header("Content-Type: image/png"); echo $imagick->getImageBlob(); }
public function renderImageShepards() { $points = [ [0.30, 0.10, 'red'], [0.10, 0.80, 'blue'], [0.70, 0.60, 'lime'], [0.80, 0.20, 'yellow'], ]; $imagick = createGradientImage(600, 600, $points, \Imagick::SPARSECOLORMETHOD_SPEPARDS); header("Content-Type: image/png"); echo $imagick->getImageBlob(); }
public function renderImageVoronoi() { $points = [ [0.30, 0.10, 'red'], [0.10, 0.80, 'blue'], [0.70, 0.60, 'lime'], [0.80, 0.20, 'yellow'], ]; $imagick = createGradientImage(500, 500, $points, \Imagick::SPARSECOLORMETHOD_VORONOI); header("Content-Type: image/png"); echo $imagick->getImageBlob(); }
public function renderImageBarycentric() { $points = [ [0, 0, 'skyblue'], [-1, 1, 'skyblue'], [1, 1, 'black'], ]; $imagick = createGradientImage(600, 200, $points, \Imagick::SPARSECOLORMETHOD_BARYCENTRIC); header("Content-Type: image/png"); echo $imagick->getImageBlob(); }
function createGradientImage($width, $height, $colorPoints, $sparseMethod, $absolute = false) { $imagick = new \Imagick(); $imagick->newImage($width, $height, "white"); $imagick->setImageFormat("png"); $barycentricPoints = array(); foreach ($colorPoints as $colorPoint) { if ($absolute == true) { $barycentricPoints[] = $colorPoint[0]; $barycentricPoints[] = $colorPoint[1]; } else { $barycentricPoints[] = $colorPoint[0] * $width; $barycentricPoints[] = $colorPoint[1] * $height; } if (is_string($colorPoint[2])) { $imagickPixel = new \ImagickPixel($colorPoint[2]); } else if ($colorPoint[2] instanceof \ImagickPixel) { $imagickPixel = $colorPoint[2]; } else { $errorMessage = sprintf( "Value %s is neither a string nor an ImagickPixel class. Cannot use as a color.", $colorPoint[2] ); throw new \InvalidArgumentException( $errorMessage ); } $red = $imagickPixel->getColorValue(\Imagick::COLOR_RED); $green = $imagickPixel->getColorValue(\Imagick::COLOR_GREEN); $blue = $imagickPixel->getColorValue(\Imagick::COLOR_BLUE); $alpha = $imagickPixel->getColorValue(\Imagick::COLOR_ALPHA); $barycentricPoints[] = $red; $barycentricPoints[] = $green; $barycentricPoints[] = $blue; // TODO - document this as a change on IM7 //$barycentricPoints[] = $alpha; } $imagick->sparseColorImage($sparseMethod, $barycentricPoints); return $imagick; }