Поддерживает ли SVG встраивание растровых изображений?


147

Является ли изображение SVG чисто векторным или мы можем объединить растровые изображения в изображение SVG? Как насчет преобразований, применяемых к растровым изображениям (перспектива, отображения и т. Д.)?

Редактировать : Изображения могут быть включены в SVG по ссылке. См. Http://www.w3.org/TR/SVG/struct.html#ImageElement . Мой вопрос был на самом деле, если растровые изображения могут быть включены в SVG так, чтобы изображение SVG было автономным. В противном случае, всякий раз, когда отображается изображение svg, необходимо перейти по ссылке и загрузить изображение. Очевидно, файлы .svg - это просто XML-файлы.

Ответы:


207

Да, вы можете ссылаться на любое изображение из <image>элемента. И вы можете использовать данные URI, чтобы сделать SVG полностью автономным. Пример:

<image width="100" height="100" xlink:href="data:image/png;base64,...">

Точки - это то место, куда вы добавляете закодированные данные base64. Редакторы векторной графики, поддерживающие svg, обычно имеют опцию сохранения со встроенными изображениями. В противном случае существует множество инструментов для кодирования в и из base64.

Вот полный пример из svg testsuite.


2
@ Александр, это отдельный вопрос, и я уверен, что вы можете найти ответ на него на этом сайте (кодирование чего-либо в base64 не зависит от svg).
— Эрик Дальстрем

1
@Erik - Предположим, у меня повторяется одно и то же изображение тысячу раз в одном SVG-файле. Могу ли я разместить данные base64 в одном месте, и пусть изображение ссылается на эти данные оттуда?
— Rohit Vats

3
@Erik - не берите в голову, я получил свой ответ отсюда - stackoverflow.com/questions/16685014/… . Ответ говорит о группировке там. :)
— Rohit Vats

3
Не забудьте объявить пространство имен xlinkкак есть: xmlns:xlink="http://www.w3.org/1999/xlink"некоторые браузеры /
— зрители

1
К вашему сведению: согласно моему опыту, браузер Chrome отображает это изображение, даже если вы не укажете widthи heightв теге svg image. Однако Firefox и IE не отображают изображение, если вы пропустите эти атрибуты. Поэтому обязательно укажите их!
— Камнедробилка

23

Здесь я разместил скрипку с данными, удаленными и локальными изображениями, встроенными в SVG, внутри HTML-страницы:

http://jsfiddle.net/MxHPq/

<!DOCTYPE html>
<html>
<head>
    <title>SVG embedded bitmaps in HTML</title>
    <style>

        body{
            background-color:#999;
            color:#666;
            padding:10px;
        }

        h1{
            font-weight:normal;
            font-size:24px;
            margin-top:20px;
            color:#000;
        }

        h2{
            font-weight:normal;
            font-size:20px;
            margin-top:20px;
        }

        p{
            color:#FFF;
            }

        svg{
            margin:20px;
            display:block;
            height:100px;
        }

    </style>
</head>

<body>
    <h1>SVG embedded bitmaps in HTML</h1>
    <p>The trick appears to be ensuring the image has the correct width and height atttributes</p>

    <h2>Example 1: Embedded data</h2>
    <svg id="example1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
        <image x="0" y="0" width="5" height="5" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="/>
    </svg>

    <h2>Example 2: Remote image</h2>
    <svg id="example2" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
        <image x="0" y="0" width="275" height="95" xlink:href="http://www.google.co.uk/images/srpr/logo3w.png" />
    </svg>

    <h2>Example 3: Local image</h2>
    <svg id="example3" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
        <image x="0" y="0" width="136" height="23" xlink:href="/img/logo.png" />
    </svg>


</body>
</html>

17

Вы можете использовать Data URI для предоставления данных изображения, например:

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">

<image width="20" height="20" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="/>

</svg>

Изображение будет проходить через все обычные преобразования SVG.

Но у этой техники есть недостатки, например, изображение не будет кэшироваться браузером.


если SVG требует URI данных, то это, по-видимому, не является недостатком - я отредактирую свой ответ
— GarethOwen

Встроенные изображения (данные URI) будут кэшироваться вместе с документом, в котором они находятся, см., Например, stackoverflow.com/questions/4791807/data-uris-and-caching
— Эрик Дальстрём,

Точно - если документ svg изменится, встроенное растровое изображение будет перезагружено, даже если оно совпадает. Если мы ссылаемся на URL-адрес http, это может быть кэшировано отдельно в документе svg.
— GarethOwen

1
Хорошая точка зрения. В моем комментарии к ответу Ника вы увидите рациональное встраивание растрового изображения в изображение SVG. Хотя вы правы, кодировка плохая и неэффективная. Это должен быть отдельный двоичный кодированный файл, перемещаемый вместе с изображением svg.
— chmike

2

Вы можете использовать data:URL для встраивания версии изображения в кодировке Base64. Но это не очень эффективно и не рекомендовало бы встраивать большие изображения. Любая причина ссылки на другой файл не представляется возможным?


Это зависит от варианта использования. Я рассматриваю вариант использования, в котором копируется svg-файл, и доступ к Интернету не всегда доступен (например, визитная карточка). ИТ также позволяет сохранить использование карты в тайне. С помощью связанного изображения владелец изображения может отслеживать все показы своих карточек, которые могут быть ему интересны, но не владельцу карточки. Автономное изображение SVG имеет смысл.
— Чмике

Это правда, если вы используете абсолютный URL, указывающий куда-то в Интернете. Но использовать относительный URL-адрес легко, так что если файл SVG является локальным, изображение тоже будет. Если у вас также есть требование, чтобы это был один единственный распространяемый файл, то это снова меняет дело.
— Ник

В некоторых случаях требуется, чтобы SVG-изображение было автономным, то есть ОДИН файл, содержащий все изображение. При обработке изображений в файловых системах необходимость переносить / хранить несколько файлов для обеспечения визуализации изображения - нехорошая вещь - вещи могут быть несинхронизированы или отброшены слишком легко.
— Минок

-1

Также возможно включить растровые изображения. Я думаю, что вы также можете использовать преобразования на этом.


На самом деле. Я только что нашел эту ссылку: w3.org/TR/SVG/struct.html#ImageElement . К сожалению, это не отвечает моей озабоченности, которая, как я заметил, не указана в вопросе. Я отредактирую вопрос.
— chmike
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.