Estoy enviando una representación de cadena de un archivo SVG para el servidor y el uso de Imagick convertir esto en un archivo JPEG de la siguiente manera:cómo cambiar el tamaño de un SVG con Imagick/ImageMagick
$image = stripslashes($_POST['json']);
$filename = $_POST['filename'];
$unique = time();
$im = new Imagick();
$im->readImageBlob($image);
$im->setImageFormat("jpeg");
$im->writeImage('../photos/' . $type . '/humourised_' . $unique . $filename);
$im->clear();
$im->destroy();
Sin embargo Deseo Cambie el tamaño del SVG antes de rasterizarlo para que la imagen resultante sea más grande que las dimensiones especificadas dentro del archivo SVG.
he modificado mi código a la siguiente:
$image = stripslashes($_POST['json']);
$filename = $_POST['filename'];
$unique = time();
$im = new Imagick();
$im->readImageBlob($image);
$res = $im->getImageResolution();
$x_ratio = $res['x']/$im->getImageWidth();
$y_ratio = $res['y']/$im->getImageHeight();
$im->removeImage();
$im->setResolution($width_in_pixels * $x_ratio, $height_in_pixels * $y_ratio);
$im->readImageBlob($image);
$im->setImageFormat("jpeg");
$im->writeImage('../photos/' . $type . '/humourised_' . $unique . $filename);
$im->clear();
$im->destroy();
Este código debe trabajar a cabo la resolución y cambiar el tamaño de SVG en consecuencia. Funciona perfectamente si el lienzo SVG y sus elementos tienen anchos basados en 'porcentaje', sin embargo, no parece funcionar con los elementos definidos en 'px'. Lo cual es lamentablemente un requisito.
Una cadena SVG típica que se enviará al servidor tiene el siguiente aspecto:
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/SVG/DTD/svg10.dtd">
<svg id="tempsvg" style="overflow: hidden; position: relative;" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="333" version="1.1" height="444">
<image transform="matrix(1,0,0,1,0,0)" preserveAspectRatio="none" x="0" y="0" width="333" height="444" xlink:href="http://www.songbanc.com/assets/embed/photos/full/133578615720079914224f9e7aad9ac871.jpg"></image>
<image transform="matrix(1,0,0,1,0,0)" preserveAspectRatio="none" x="85.5" y="114" width="50" height="38" xlink:href="http://www.songbanc.com/assets/embed/humourise/elements/thumb/thumb_lips4.png"></image>
<path transform="matrix(1,0,0,1,0,0)" fill="none" stroke="#000" d="M110.5,133L140.5,133" stroke-dasharray="- " opacity="0.5"></path>
<circle transform="matrix(1,0,0,1,0,0)" cx="140.5" cy="133" r="5" fill="#000" stroke="#000"></circle>
<path transform="matrix(1,0,0,1,0,0)" fill="none" stroke="#000" d="M110.5,133L110.5,155.8" stroke-dasharray="- " opacity="0.5"></path>
<circle transform="matrix(1,0,0,1,0,0)" cx="110.5" cy="155.8" r="5" fill="#000" stroke="#000"></circle>
<circle transform="matrix(1,0,0,1,0,0)" cx="110.5" cy="133" r="5" fill="#000" stroke="#000"></circle>
</svg>
Como se puede ver los elementos que componen tiene anchos de definición de píxeles y alturas (usando porcentajes desgraciadamente, no es esta imagen SVG opción para esta aplicación)
¿Hay alguna forma de evitar esto? O cualquier otro método para convertir un SVG a png y renderizarlo en un tamaño determinado sin pérdida de calidad.
Gracias.
EDITAR: Aunque nunca logré encontrar la solución perfecta. En su lugar, terminé enviando los datos SVG como json, recorriendo su lado del servidor y escalando los píxeles a la altura deseada.
Luego, después de mucha prueba y error, me di cuenta de que imagemagick tenía problemas con los comandos estándar de transformación/rotación SVG, descartando cualquier elemento manipulado. Terminé cambiando demasiado 'inkscape' para representar el SVG resultante como una imagen rasterizada. Y todo está bien. Todavía estoy investigando una posible solución de fórmula para compensar las diferencias que crea imagemagick. Si tengo éxito, actualizaré esta pregunta nuevamente.
Desde [su otra pregunta] (http://stackoverflow.com/questions/10400897/how-to-convert-an-svg-string-into-a-jpg-with-inkscape) Sospecho que usted tiene ahora cambiado a Inkscape (que puede escalar una imagen usando opciones en la línea de comando). Si ese es el caso, ¿agregarías un comentario debajo de la pregunta? ':)'. – halfer
De hecho ... voy a editar mi pregunta en consecuencia. :-) – gordyr
¡Me encantaría ver más detalles sobre su solución Inkscape! – supertrue