/ / Jak uzyskać szerokość i wysokość obrazu SVG w PHP? - php, svg, wymiary

Jak uzyskać szerokość i wysokość obrazu SVG w PHP? - php, svg, wymiary

Próbowałem użyć getimagesize() na pliku SVG, ale nie powiodło się.

Wiem, że SVG to „skalowalna grafika wektorowa”, ale uważam, że „elementy kontrolne” przeglądarki Google Chrome mogą doskonale uzyskać wymiary obrazu SVG, więc podejrzewam, że jest to również możliwe w PHP.

Jeśli trudno jest uzyskać wymiary, czy jest jakiś sposób, aby ocenić, czy obraz SVG jest pionowy czy poziomy?

Odpowiedzi:

8 dla odpowiedzi № 1

Chodzi o to, że obrazy SVG nie mają „rozmiaru” w takim znaczeniu, w jakim zapewne myślisz. Z drugiej strony mają stosunek wysokości do szerokości.

Ten stosunek zwykle można znaleźć w viewBox atrybut.

Jeśli z drugiej strony viewBox atrybut nie jest obecny w głównym elemencie SVG, współczynnik obrazu nie jest łatwy do ustalenia.

Edytować:

Uwaga dodatkowa: Powód, dla którego Chrome podaje idealne współrzędne, niekoniecznie dlatego, że patrzy na SVG w celu ustalenia rozmiaru; może to być bardzo prosty wynik oprawa Rozmiar.

Chociaż element SVG ma height i width atrybuty, mogą nie być określone jako piksele, ale dowolna liczba jednostek, więc niekoniecznie są dużą pomocą.


9 dla odpowiedzi nr 2

SVG to po prostu plik XML, więc biblioteki GD nie będą pomocne!

Po prostu powinieneś być w stanie przeanalizować plik XML, aby uzyskać takie właściwości.

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

Wartości muszą być rzutowane, inaczej zwrócą obiekt.


3 dla odpowiedzi nr 3

Miałem to samo pytanie, ponieważ nie mogłem znaleźć odpowiedzi, wymyślić i rozwiązać w następujący sposób:

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

Pamiętaj, że plik SVG, którego użyłem, został utworzony w programie Adobe Illustrator. Tak więc kod svg obrazu zaczyna się w następujący sposób:

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

Dzięki temu mogłem uzyskać wartości szerokości i wysokości.

I używam substr bo $svgfile[width] zwraca wartość z sufiksem „px”. Mógłbym również użyć wartości viewBox i podzielić ją, aby uzyskać wartości.

Pozdrowienia z Santiago, Chile


2 dla odpowiedzi № 4

Jeśli chodzi o wymiary, istnieją zasadniczo trzy różne typy obrazów SVG:

  1. Naprawiono wymiary: Obrazy, które mają width i height atrybuty Chrome może doskonale wyświetlać te wymiary i konwertuje określone jednostki na piksele.

  2. Wymiary proporcjonalne: Obrazy SVG z viewBox atrybut. Chrome pokazuje maksymalny rozmiar takich obrazów 300x150. Obraz o proporcjach 16: 9 jest pokazany jako 267x150.

  3. Brak wymiarów: Obrazy SVG bez width, height i viewBox. Chrome (i inne przeglądarki także) używają domyślnego rozmiaru 300x150 dla takich obrazów.

Można uzyskać wymiary za pomocą PHP, czytając zawartość obrazu SVG za pomocą PHP Rozszerzenie DOM i stosując zasady z góry. Napisałem bibliotekę PHP contao / imagine-svg robi to dokładnie i może być używane w następujący sposób:

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

Jeśli nie chcesz polegać na bibliotece innej firmy, możesz spojrzeć na kod źródłowy getSize() metoda aby zobaczyć, jak biblioteka określa wymiary.


0 dla odpowiedzi № 5

Tutaj jest szybko i brudno włam się, aby sprawdzić rozmiar pola widzenia za pomocą wyrażenia regularnego. Działa w większości przypadków, ale zobacz inne odpowiedzi, aby dowiedzieć się o jego ograniczeniach.

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