Как вы получаете ширину и высоту изображения 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-изображений:
-
Фиксированные размеры: изображения с атрибутами width
и height
. Chrome может прекрасно отображать эти размеры и преобразовывать указанные единицы в пиксели.
-
Пропорциональные размеры: изображения SVG с атрибутом viewBox
. Chrome показывает размер таких изображений, максимально до 300x150
. Таким образом, изображение с соотношением 16: 9 показано как 267x150
.
-
Без измерений: изображения 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()
чтобы узнать, как библиотека определяет размеры.