Comment voulez-vous obtenir la largeur et la hauteur d'un SVG image en PHP?
J'ai essayé d'utiliser getimagesize()
sur un fichier SVG, mais il a échoué.
Je sais que SVG est “Scalable Vector Graphics”, mais je trouve que Google Chrome “passer en Revue les éléments” peut parfaitement obtenir les dimensions d'une image SVG, donc je pense que c'est aussi possible en PHP.
Si il est difficile d'obtenir les dimensions, est-il possible de juger si une SVG image est à la verticale ou à l'horizontale?
OriginalL'auteur cj333 | 2011-06-30
Vous devez vous connecter pour publier un commentaire.
La chose est: SVG images n'ont pas de "taille" dans le sens que vous pensez probablement. D'autre part, ils ont une hauteur-largeur d'image.
Ce ratio peut généralement être trouvés dans la
viewBox
attribut.Si, d'autre part, la
viewBox
attribut n'est pas présent sur la racine de l'élément SVG, le rapport de l'image est très importante pour déterminer.Edit:
Note de côté: La raison pour Chrome vous donne parfait coordonnées n'est pas nécessairement parce qu'il regarde le SVG pour déterminer la taille; il pourrait très bien être une simple suite de cela réglage la taille.
Bien que l'élément SVG n'ont
height
etwidth
attributs, ceux-ci pourraient ne pas être spécifiée en pixels, mais un certain nombre d'unités, de sorte qu'ils ne sont pas nécessairement beaucoup d'aide.viewbox
, mais il sembleviewbox
devez également définir laDimensions
manuellement, pas automatique. comment faire pour transférer unSVG
àviewbox
xml file
? il doit maintenir le format de l'image. Merci.Erreur d'analyse.
Totland, @Brian, désolé, je ne sais toujours pas comment l'utiliser. comme
viewbox
exemple, si je sais que lawidth="500" height="300"
je peux l'obtenir facilement. Mais la situation réelle est que je ne sais pas. Je sais juste que c'est l'urlhttp://upload.wikimedia.org/wikipedia/commons/6/6c/Cog-scripted-svg.svg
Cet exemple particulier est trivial: Prendre la viewBox contenu, divisés sur l'espace, il faut soustraire le premier terme de la troisième terme pour obtenir X de taille, et le deuxième terme de la quatrième terme pour obtenir Y taille.
Totland, je ne suis pas sûr si c'est trivial. Il a également
width
etheight
attributs, et au moins dans FF 3.6 ceuxwidth
etheight
sont utilisés, c'est à dire, la taille de l'image affichée est plutôt 70x100 que 350x500.OriginalL'auteur Williham Totland
Un SVG est tout simplement un fichier XML, de sorte que le GD libs ne sont d'aucune aide!
Vous devez simplement être en mesure d'analyser le fichier XML pour obtenir de telles propriétés.
Les valeurs doivent être exprimées ou ils seront de retour d'un objet.
simplexml_load_file(filename.svg)
? MerciLà vous allez 🙂 - edité réponse. Ouais bien sûr à partir d'un fichier, vient de faire de chaîne XML pour montrer que ça fonctionne.
Btw, comme Williham Totland mentionné, ce ne peut pas être garantie à des pixels, sauf si vous êtes dans le contrôle des fichiers SVG et que vous êtes sûr de choses.
OriginalL'auteur Brian
J'ai eu la même question que je ne pouvais pas trouver une réponse, d'inventer et résolu comme suit:
Noter que le fichier SVG que j'ai utilisé a été créé dans Adobe Illustrator. Ainsi, le code svg de l'image commence comme suit:
Grâce à cela, j'ai pu obtenir des valeurs de largeur et hauteur.
Et j'utilise
substr
parce que$svgfile[width]
renvoie la valeur avec "px" suffixe. J'ai pu également utiliser viewBox de la valeur et de la diviser pour obtenir les valeurs.Salutations de Santiago, Chili
$svgfile = simplexml_load_file($imageFileName);
list($x_start, $y_start, $x_end, $y_end) = explode(' ', $svgfile['viewBox']);
J'aime cette solution mais j'ai déjà vu des fichiers svg width=100% et height=100%, pourrait être envisagée.
La Solution pour éliminer toute alphanumériques, de signes en hauteur et en largeur ("px", "%", etc.): $svgwidth = preg_replace("/[^0-9,.]/", "", $svgfile[largeur]); $svgheight = preg_replace("/[^0-9,.]/", "", $svgfile[hauteur]);
OriginalL'auteur Patografica
Concernant les dimensions, il existe essentiellement trois types d'images SVG:
Fixe dimensions: Images qui ont
width
etheight
attributs. Chrome peut afficher ces dimensions parfaitement et convertit le spécifiée en unités de pixels.Proportionnelle dimensions: images SVG avec un
viewBox
attribut. Chrome affiche la taille de ces images agrandies à300x150
. Donc une image avec un ratio de 16:9 est présenté comme267x150
.Pas de dimensions: images SVG sans
width
,height
etviewBox
. Chrome (et les autres navigateurs) utiliser une valeur par défaut de la taille de300x150
pour de telles images.Il est possible d'obtenir les dimensions avec PHP par la lecture du contenu de l'image SVG avec PHPs DOM extension et en appliquant les règles ci-dessus. J'ai écrit la bibliothèque PHP contao/imaginez-svg qui fait exactement cela et peut être utilisé comme suit:
Si vous ne voulez pas compter sur un troisième partie de la bibliothèque, vous pouvez regarder le le code source de la
getSize()
méthode de voir comment la bibliothèque détermine les dimensions.OriginalL'auteur ausi
Voici un rapide et sale hack pour vérifier la viewbox taille avec la regex. Il fonctionne dans la plupart des cas, mais ne voir les autres réponses pour avoir une idée de ses limites.
OriginalL'auteur cronoklee