/** * 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; }