2011-06-30 20 views
10

Intenté usar getimagesize() en un archivo SVG, pero falló.¿Cómo se obtiene el ancho y alto de una imagen SVG en PHP?

Sé que SVG es "Scalable Vector Graphics", pero considero que los "Elementos de revisión" de Google Chrome pueden obtener perfectamente las dimensiones de una imagen SVG, así que sospecho que esto también es posible en PHP.

Si es difícil obtener las dimensiones, ¿hay alguna manera de juzgar si una imagen SVG es vertical u horizontal?

Respuesta

7

Lo que pasa es que las imágenes SVG no tienen un "tamaño" en el sentido en que probablemente estés pensando. Por otro lado, SI tienen una relación altura/ancho.

Esta relación generalmente se puede encontrar en el atributo viewBox.

Si, por otro lado, el atributo viewBox no está presente en el elemento raíz SVG, la relación de imagen no es muy difícil de determinar.

Editar:

Nota al margen: La razón Chrome te da las coordenadas perfectas no es necesariamente porque se ve en el SVG para determinar el tamaño; podría ser un resultado simple de configuración del tamaño.

Aunque el elemento SVG tiene atributos height y width, estos pueden no especificarse como píxeles, sino como unidades, por lo que no son necesariamente de mucha ayuda.

+0

@Williham Totland, he leído el 'viewbox', pero parece que' viewbox' también debe establecer 'Dimensions' manualmente, no de forma automática. cómo transferir un 'SVG' a' viewbox' 'archivo xml' debe mantener la relación de aspecto de la imagen. Gracias. – cj333

+0

@ cj333: Error de análisis. –

+0

@Williham Totland, @Brian, lo siento, todavía no sé cómo usarlo. como ejemplo de 'viewbox', si conozco 'width =" 500 "height =" 300 "' puedo obtenerlo fácilmente. Pero la situación real es que no lo sé. Solo sé que es url 'http: // upload.wikimedia.org/wikipedia/commons/6/6c/Cog-scripted-svg.svg' – cj333

9

¡Un SVG es simplemente un archivo XML, por lo que las libs de 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 se deben convertir o devolverán un objeto.

+0

¿cómo hacer eso? use 'simplexml_load_file (filename.svg)'? Gracias – cj333

+0

Ahí va :) - respuesta editada. Sí, obviamente, obtener de archivo, acaba de cadena de XML para mostrar que funciona. – Brian

+0

Por cierto, como mencionó Williham Totland, no se garantiza que sean píxeles, a menos que controle los archivos SVG y esté seguro de ello. – Brian

3

que tenían la misma pregunta que no pude encontrar una respuesta, inventar y resuelto de la siguiente manera:

<?php 
    $svgfile = simplexml_load_file("svgimage.svg"); 
    $width = substr($svgfile[width],0,-2); 
    $height = substr($svgfile[height],0,-2); 
?> 

Tenga en cuenta que el archivo SVG utilicé fue creado en Adobe Illustrator. Por lo tanto, el código SVG de la imagen comienza de la siguiente manera:

<?xml version="1.0" encoding="utf-8"?> 
<!-- Generator: Adobe Illustrator 14.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 43363) --> 
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" 
width="400px" height="738px" viewBox="0 0 400 738" enable-background="new 0 0 400 738" xml:space="preserve"> 
... 

Gracias a esto, se pueden obtener valores de anchura y altura.

Y yo uso substr porque $svgfile[width] devuelve el valor con el sufijo "px". También podría usar el valor viewBox y dividirlo para obtener los valores.

Saludos desde Santiago, Chile

+1

'$ svgfile = simplexml_load_file ($ imageFileName);' 'list ($ x_start, $ y_start, $ x_end, $ y_end) = explode ('', $ archivoSDV ['viewBox']);' –

+0

Me gusta esta solución pero ya vimos archivos svg con ancho = 100% y alto = 100%, podría considerarse. – Jonny

+0

Solución para eliminar cualquier signo alfanumérico en altura y ancho ("px", "%", etc.): $ svgwidth = preg_replace ("/ [^ 0-9,.] /", "", $ ArchivoSVan [ancho]); $ svgheight = preg_replace ("/ [^ 0-9,.] /", "", $ ArchivoSV [altura]); – Jonny

0

en cuanto a dimensiones existen básicamente tres tipos diferentes de imágenes SVG:

  1. dimensiones fijas: imágenes que han width y height atributos.Chrome puede mostrar estas dimensiones perfectamente y convierte las unidades especificadas en píxeles.

  2. Dimensiones proporcionales: imágenes SVG con un atributo viewBox. Chrome muestra el tamaño de dichas imágenes maximizadas a 300x150. Entonces, una imagen con una relación de 16: 9 se muestra como 267x150.

  3. No Dimensiones: imágenes SVG sin width, height y viewBox. Chrome (y otros navegadores también) usan un tamaño predeterminado de 300x150 para tales imágenes.

Es posible hacer llegar las dimensiones con PHP leyendo el contenido de la imagen SVG con los PHP DOM extension y aplicando las reglas de arriba. Escribí la librería PHP contao/imagine-svg que hace exactamente eso y puede ser utilizado de la siguiente manera:

$size = (new Contao\ImagineSvg\Imagine) 
    ->open('/path/to/image.svg') 
    ->getSize(); 
echo $size->getWidth(); 
echo $size->getHeight(); 

Si no quiere depender de una biblioteca de terceros, se puede ver en la source code of the getSize() method ver cómo la biblioteca determina las dimensiones.

Cuestiones relacionadas