Come posso scalare un SVG e salvare come PNG, con PHP senza perdere qualità?

Ho un lotto di immagini SVG che ho bisogno di ridimensionare e quindi salvare come PNG, e mi piacerebbe usare PHP per farlo. Domande simili alla mia sono state poste ma nessuna delle soluzioni funziona per me. Per esempio:

opzione A : usa PHP per modificare l'attributo width e height di SVG.

problema con A : sembra funzionare bene ma in realtà aumenta solo le size della canvas, non il contenuto della canvas. Non sono sicuro che sia importnte ma i miei SVG sono piccoli elementi grafici creati con Illustrator, costituiti per lo più da elementi di path.

opzione B : usa l'image per ridimensionare e salvare

esempio :

$im = new Imagick(); $im->setResolution( $startResolution * ($newWidth / $oldWidth ), $startResolution * ($newHeight / $oldHeight ) ); $im->readImage( $svgSource ); $im->setImageFormat("png32"); echo '<img src="data:image/png;base64,' . base64_encode($im) . '" />'; 

problema con B : anche questo sembra funzionare bene ma il png risultante sarà sfocato

opzione C : variante dell'opzione B, si imposta la risoluzione veramente alta, come 5000, quindi ridimensiona.

problema con C : il PNG risultante è ancora sfocato

opzione D : usa exec (convert …) per aggirare i bug di PHP

problema con D : avete indovinato, il PNG risultante è ancora sfocato

Qualcuno ha trovato un modo per farlo funzionare?

Per l'opzione A:

Se la svg si aspetta che il sistema di coordinate sia quello che era quando è stato creato (leggi: width / altezza originale), allora sarà necessario aggiungere un attributo viewBox (usa 0 0 originalwidth originalheight ). Quindi, quando imposti nuovi attributi di width e altezza, la svg dovrebbe ridimensionarsi correttamente alla nuova dimensione.

Ho acquisito questa cosa simile usando la libreria 'batik'.

Ho specificato "Area di interesse" che deve essere convertito in Png. ecco cosa ho fatto

  public function makeSvgtoPngImages() { $tempSVG_filename = $user_folder_path . 'temp.svg'; $tempSVG_handle = fopen($tempSVG_filename, 'w+'); fwrite($tempSVG_handle, $user_svg_content); fclose($tempSVG_handle); $mimetype = 'image/png'; $width =2000; $height=2000; $area_interest = '472,185,555,275'; // in my case i am using area of interest is my viewBox $result = shell_exec('java -jar /var/www/batik-1.7/batik-rasterizer.jar -m ' . $mimetype . ' -d ' . $outputfile . ' -w ' . $width . ' -h ' . $height . ' -a ' . $area_interest . ' ' . $tempSVG_filename . ' 2>&1'); unlink($tempSVG_filename); }