SVG линейный градиент отображается по-разному в разных программах, когда отсутствует атрибут x2

553
Socob

Я недавно импортировал и отредактировал файл в Inkscape . Я сохранил изображение как «оптимизированный SVG» в Inkscape, но когда я открывал полученный файл в разных программах, некоторые отображали его так же, как Inkscape, в то время как другие не применяли определенный линейный градиент (в то время как все другие части изображения, в том числе градиенты, работали нормально).

Пока что для предыстории. Я сжал свое исходное изображение в минимальном примере и определил, какая часть источника SVG заставляет разных зрителей вести себя по-разному. Это мой пример файла SVG:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> <svg xmlns="http://www.w3.org/2000/svg" height="982" width="982" version="1.1" viewBox="0 0 982 982"> <defs> <linearGradient id="a" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-62.075 1070.8 1070.8 62.075 521.8 -42.09)"> <stop stop-color="#bbb9c2" offset="0"/> <stop stop-color="#3f3" offset="1"/> </linearGradient> </defs> <path fill="url(#a)" d="m0 491.11c0 271.12 219.78 490.89 490.85 490.89 271.13 0 490.92-219.77 490.92-490.89 0-271.07-219.79-490.86-490.92-490.86-271.07 0-490.85 219.79-490.85 490.86"/> </svg> 

Вот как это выглядит в Inkscape и в программе просмотра изображений GNOME («Глаз GNOME») : example SVG image in Inkscape or Eye of GNOME

Вот как это выглядит в браузерах Firefox и Chromium: example SVG image in Firefox or Chromium

Однако я заметил, что если вы добавите атрибут x2="1"к <linearGradient>элементу, изображение будет выглядеть одинаково во всех этих средствах просмотра .

К сожалению, я недостаточно знаком с деталями формата файла SVG и стандарта SVG, но мне кажется ясным, что одна из этих интерпретаций моего файла должна быть неправильной (то есть нарушать стандарт) . Кто-нибудь знает, чья сторона права (например, для каких программ я должен подать отчет об ошибке)?

0
Стандарт [довольно ясно заявляет] (https://www.w3.org/TR/SVG11/pservers.html#LinearGradientElementX1Attribute), что все x1, x2, y1 и y2 являются необязательными и имеют значения по умолчанию. Juancho 7 лет назад 0
И, похоже, в стандарте есть ошибка, так как значения по умолчанию составляют соответственно 0%, 100%, 0% и ** 0% **. Juancho 7 лет назад 0
@Juancho Aaah, I see. I wouldn’t have expected that, but if you think about it, it makes sense. A gradient vector that is the null vector doesn’t really make sense, so they can’t set all defaults to 0%, and arbitrarily picked a vector pointing in the positive x direction. So I don’t think it’s a bug in the standard, but in the software that doesn’t implement these defaults correctly. Socob 7 лет назад 1

1 ответ на вопрос

0
Socob

Хорошо, так что я не совсем уверен, какое из этих двух представлений является правильным, но я подозреваю, что это то, что отображается в веб-браузерах, потому что я обнаружил ошибки, влияющие на поведение в моем примере как в Inkscape, так и в Eye of GNOME (см. ниже).

Я уже понял, в чем причина того, как я был проинформирован об этой проблеме, в первую очередь: Файл SVG я открыл с помощью Inkscape был <linearGradient>с атрибутами gradientUnits="userSpaceOnUse"и x2="1"(так же, как в моем примере). При сохранении в качестве «оптимизированного SVG» Inkscape «оптимизировал» x2="1"атрибут, поскольку он интерпретировал его как эквивалентный x2="100%", который является x2атрибутом по умолчанию, как указано в стандарте SVG, и, следовательно, может быть опущен. Однако, интерпретация Inkscape по x2="100%"x2="1"это (возможно) неправильно - это Inkscape ошибка # 1153706 .

В ходе своих исследований по этому вопросу, я столкнулся с различными несогласованности о том, как различное программное обеспечение обрабатывает gradientUnits="userSpaceOnUse"в сочетании с атрибутами вектор градиента x1, x2, y1и y2. Ниже приведены сообщения об ошибках, которые либо уже существуют, либо которые я сам подал в результате своих выводов:

Похожие вопросы