/**
* Rasterizes an SVG image to a PNG.
*
* Uses phantomjs to save the SVG as a PNG image at the specified size.
*
* @access public
*
* @param string $file The path to the file that should be rasterized.
* @param string $dest The path to the directory where the output PNG should be saved.
* @param integer $columns The number of columns in the output image. 0 = maintain aspect ratio based on $rows.
* @param integer $rows The number of rows in the output image. 0 = maintain aspect ratio based on $columns.
*/
public static function rasterize($file, $dest, $columns, $rows)
{
// check the input
if (!file_exists($file)) {
return false;
}
if (!file_exists($dest) || !is_dir($dest)) {
return false;
}
// figure out the output width and height
$svgTmp = new Respimg($file);
$width = (double) $svgTmp->getImageWidth();
$height = (double) $svgTmp->getImageHeight();
$new_width = $columns;
$new_height = $rows;
$x_factor = $columns / $width;
$y_factor = $rows / $height;
if ($rows < 1) {
$new_height = round($x_factor * $height);
} elseif ($columns < 1) {
$new_width = round($y_factor * $width);
}
// get the svg data
$svgdata = file_get_contents($file);
// figure out some path stuff
$dest = rtrim($dest, '/');
$filename = substr($file, strrpos($file, '/') + 1);
$filename_base = substr($filename, 0, strrpos($filename, '.'));
// setup the request
$client = Client::getInstance();
$serviceContainer = ServiceContainer::getInstance();
$procedureLoaderFactory = $serviceContainer->get('procedure_loader_factory');
$procedureLoader = $procedureLoaderFactory->createProcedureLoader(__DIR__);
$client->getProcedureLoader()->addLoader($procedureLoader);
$request = new RespimgCaptureRequest();
$request->setType('svg2png');
$request->setMethod('GET');
$request->setSVG(base64_encode($svgdata));
$request->setViewportSize($new_width, $new_height);
$request->setRasterFile($dest . '/' . $filename_base . '-w' . $new_width . '.png');
$request->setWidth($new_width);
$request->setHeight($new_height);
$response = $client->getMessageFactory()->createResponse();
// send + return
$client->send($request, $response);
return true;
}