Как вы получаете ширину и высоту изображения SVG в PHP?

Я попытался использовать getimagesize() в SVG файле, но это не удалось.

Я знаю, что SVG - это "Масштабируемая векторная графика", но я обнаружил, что Google Chromes "Элементы обзора" могут получить размеры изображения SVG, поэтому я подозреваю, что это также возможно на PHP.

Если трудно получить размеры, есть ли способ оценить, является ли изображение SVG вертикальным или горизонтальным?

Ответ 1

Дело в том, что изображения SVG не имеют "размера" в том смысле, о котором вы, вероятно, думаете. С другой стороны, они имеют отношение высоты к ширине.

Это соотношение обычно можно найти в viewBox.

Если, с другой стороны, атрибут viewBox отсутствует в корневом элементе SVG, отношение изображения очень нетривиально для определения.

Редактировать:

Примечание: причина, по которой Chrome дает идеальные координаты, не обязательно потому, что она смотрит на SVG, чтобы определить размер; это вполне может быть простым результатом его установки размера.

Хотя элемент SVG имеет атрибуты height и width, они могут не указываться как пиксели, а любое из нескольких единиц, поэтому они не обязательно помогают.

Ответ 2

SVG - это просто XML файл, поэтому GD-библиотеки не помогут!

Вы должны просто проанализировать XML файл, чтобы получить такие свойства.

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

Значения должны быть отброшены или они возвратят объект.

Ответ 3

У меня был такой же вопрос, как я не мог найти ответ, изобретать и решать следующим образом:

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

Обратите внимание, что файл SVG, который я использовал, был создан в Adobe Illustrator. Итак, код svg изображения начинается следующим образом:

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

Благодаря этому я могу получить значения ширины и высоты.

И я использую substr потому что $svgfile[width] возвращает значение с суффиксом "px". Я мог бы также использовать значение viewBox и разделить его, чтобы получить значения.

Привет из Сантьяго, Чили

Ответ 4

Что касается размеров, то в основном есть три разных типа SVG-изображений:

  1. Фиксированные размеры: изображения с атрибутами width и height. Chrome может прекрасно отображать эти размеры и преобразовывать указанные единицы в пиксели.

  2. Пропорциональные размеры: изображения SVG с атрибутом viewBox. Chrome показывает размер таких изображений, максимально до 300x150. Таким образом, изображение с соотношением 16: 9 показано как 267x150.

  3. Без измерений: изображения SVG без width, height и viewBox. В Chrome (и других браузерах) для таких изображений используется размер по умолчанию 300x150.

Можно получить размеры с помощью PHP, прочитав содержимое SVG-изображения с расширением DOM PHP и применяя правила сверху. Я написал библиотеку PHP contao/imagine-svg, которая делает именно это и может использоваться следующим образом:

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

Если вы не хотите полагаться на стороннюю библиотеку, вы можете посмотреть исходный код метода getSize() чтобы узнать, как библиотека определяет размеры.