/ / Comment obtenir la largeur et la hauteur d'une image SVG en PHP? - php, svg, dimensions

Comment obtenir la largeur et la hauteur d'une image SVG en PHP? - php, svg, dimensions

J'ai essayé d'utiliser getimagesize() sur un fichier SVG, mais cela a échoué.

Je sais que SVG est «Scalable Vector Graphics», mais j’aperçois que les «éléments de révision» de Google Chrome peuvent parfaitement prendre les dimensions d’une image SVG. Je suppose donc que cela est également possible en PHP.

S'il est difficile d'obtenir les dimensions, existe-t-il un moyen de déterminer si une image SVG est verticale ou horizontale?

Réponses:

8 pour la réponse № 1

Le fait est que les images SVG n’ont pas de "taille" au sens auquel vous pensez probablement. Par contre, elles ont un rapport hauteur / largeur.

Ce rapport peut généralement être trouvé dans la viewBox attribut.

Si, en revanche, le viewBox attribut n’est pas présent sur l’élément SVG racine, le rapport d’image est extrêmement utile à déterminer.

Modifier:

Note latérale: La raison pour laquelle Chrome vous donne des coordonnées parfaites n’est pas nécessairement parce qu’elle se base sur le SVG pour déterminer sa taille. réglage la taille.

Bien que l’élément SVG ait height et width Pour les attributs, ceux-ci pourraient ne pas être spécifiés en pixels, mais en plusieurs unités, donc ils ne sont pas forcément très utiles.


9 pour la réponse № 2

Un fichier SVG est simplement un fichier XML, les bibliothèques GD ne vous seront d'aucune aide!

Vous devriez simplement pouvoir analyser le fichier XML pour obtenir de telles propriétés.

$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);

Les valeurs doivent être exprimées ou elles renverront un objet.


3 pour la réponse № 3

J'avais la même question que je ne pouvais pas trouver une réponse, inventer et résoudre comme suit:

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

Notez que le fichier SVG que j'ai utilisé a été créé dans Adobe Illustrator. Ainsi, le code svg de l'image commence comme suit:

<?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">
...

Grâce à cela, je pouvais obtenir des valeurs de largeur et de hauteur.

Et j'utilise substr car $svgfile[width] renvoie la valeur avec le suffixe "px". Je pourrais aussi utiliser la valeur viewBox et la scinder pour obtenir les valeurs.

Salutations de Santiago, Chili


2 pour la réponse № 4

En ce qui concerne les dimensions, il existe essentiellement trois types d’images SVG:

  1. Dimensions fixes: Images qui ont width et height les attributs. Chrome peut parfaitement afficher ces dimensions et convertit les unités spécifiées en pixels.

  2. Dimensions proportionnelles: Images SVG avec un viewBox attribut. Chrome indique la taille de ces images maximisée 300x150. Donc, une image avec un rapport 16: 9 est montrée comme 267x150.

  3. Pas de dimensions: Images SVG sans width, height et viewBox. Chrome (et les autres navigateurs également) utilisent une taille par défaut de 300x150 pour de telles images.

Il est possible d'obtenir les dimensions avec PHP en lisant le contenu de l'image SVG avec PHP Extension DOM et en appliquant les règles ci-dessus. J'ai écrit la librairie PHP contao / imagine-svg cela fait exactement cela et peut être utilisé comme suit:

$size = (new ContaoImagineSvgImagine)
->open("/path/to/image.svg")
->getSize();
echo $size->getWidth();
echo $size->getHeight();

Si vous ne voulez pas vous fier à une bibliothèque tierce, vous pouvez consulter le code source du getSize() méthode pour voir comment la bibliothèque détermine les dimensions.


0 pour la réponse № 5

Voici un rapide et sale bidouillez pour vérifier la taille de la visionneuse avec regex. Cela fonctionne dans la plupart des cas, mais consultez les autres réponses pour avoir une idée de ses limites.

preg_match("#viewbox=[""]d* d* (d*) (d*)#i", file_get_contents("file.svg"), $d);
$width = $d[1];
$height = $d[2];