Solución:
Un SVG es simplemente un archivo XML, por lo que las librerías GD no serán de ninguna ayuda.
Simplemente debería poder analizar el archivo XML para obtener dichas propiedades.
$xml="
<svg width="500" height="300" version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<rect x="90" y="10"
width="400" height="280"
style="fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1; " />
</svg>";
$xmlget = simplexml_load_string($xml);
$xmlattributes = $xmlget->attributes();
$width = (string) $xmlattributes->width;
$height = (string) $xmlattributes->height;
print_r($width);
print_r($height);
Los valores deben emitirse o devolverán un objeto.
La cuestión es que las imágenes SVG no tienen un “tamaño” en el sentido que probablemente estás pensando. Por otro lado, TIENEN una relación entre alto y ancho.
Esta relación generalmente se puede encontrar en el viewBox
atributo.
Si, por otro lado, el viewBox
El atributo no está presente en el elemento SVG raíz, la relación de la imagen no es trivial de determinar.
Editar:
Nota al margen: la razón por la que Chrome te da coordenadas perfectas no es necesariamente porque mira el SVG para determinar el tamaño; muy bien podría ser un simple resultado de eso configuración el tamaño.
Aunque el elemento SVG tiene height
y width
atributos, es posible que estos no se especifiquen como píxeles, sino como una serie de unidades, por lo que no son necesariamente de mucha ayuda.
En cuanto a las dimensiones, existen básicamente tres tipos diferentes de imágenes SVG:
-
Dimensiones fijas: Imágenes que tienen
width
yheight
atributos. Chrome puede mostrar estas dimensiones perfectamente y convierte las unidades especificadas en píxeles. -
Dimensiones proporcionales: Imágenes SVG con un
viewBox
atributo. Chrome muestra el tamaño de dichas imágenes maximizado para300x150
. Entonces, una imagen con una proporción de 16: 9 se muestra como267x150
. -
Sin dimensiones: Imágenes SVG sin
width
,height
yviewBox
. Chrome (y otros navegadores también) utilizan un tamaño predeterminado de300x150
para tales imágenes.
Es posible obtener las dimensiones con PHP leyendo el contenido de la imagen SVG con la extensión DOM de PHP y aplicando las reglas de arriba. Escribí la biblioteca PHP contao / imagine-svg que hace exactamente eso y se puede usar de la siguiente manera:
$size = (new ContaoImagineSvgImagine)
->open('/path/to/image.svg')
->getSize();
echo $size->getWidth();
echo $size->getHeight();
Si no desea depender de una biblioteca de terceros, puede consultar el código fuente del getSize()
método para ver cómo la biblioteca determina las dimensiones.