Example
function edgeExtend($virtualPixelType, $image_path)
{
$imagick = new \Imagick(realpath($image_path));
$imagick->setImageVirtualPixelMethod($virtualPixelType);
$imagick->scaleImage(400, 300, true);
$imagick->setImageBackgroundColor('red');
$desiredWidth = 600;
$originalWidth = $imagick->getImageWidth();
$desiredHeight = 450;
$originalHeight = $imagick->getImageHeight();
//Make the image be the desired width.
$imagick->sampleimage($desiredWidth, $desiredHeight);//$imagick->getImageHeight());
// Now scale, rotate, translate (aka affine project) it
// to be how you want
$points = array(
// The x scaling factor is 0.5 when the desired width is double
// the source width
($originalWidth / $desiredWidth),
0, // ($originalHeight / $desiredHeight), //0 means don't scale vertically
0, ($originalHeight / $desiredHeight),
// Offset the image so that it's in the centre
($desiredWidth - $originalWidth) / 2,
($desiredHeight - $originalHeight) / 2,
);
$imagick->distortImage(\Imagick::DISTORTION_AFFINEPROJECTION, $points, false);
header("Content-Type: image/jpeg");
echo $imagick->getImageBlob();
//Fyi it may be easier to think of the affine transform by
//how it works for a rotation:
//$affineRotate = array(
// "sx" => cos($angle),
// "sy" => cos($angle),
// "rx" => sin($angle),
// "ry" => -sin($angle),
// "tx" => 0,
// "ty" => 0,
//);
}