ChatGPT解决这个技术问题 Extra ChatGPT

SVG 是否支持嵌入位图图像?

SVG 图像是纯矢量的还是我们可以将位图图像组合成 SVG 图像?应用于位图图像(透视、映射等)的变换怎么样?

编辑:图像可以通过链接引用包含在 SVG 中。请参阅http://www.w3.org/TR/SVG/struct.html#ImageElement。我的问题实际上是位图图像是否可以包含在 svg 中,以便 svg 图像是自包含的。否则,无论何时显示 svg 图像,都必须遵循链接并下载图像。显然 .svg 文件只是 xml 文件。


b
bignose

是的,您可以引用 image 元素中的任何图像。您可以使用 data URIs 使 SVG 自包含。一个例子:

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

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

svg 元素属性 xmlns:xlinkxlink 声明为 namespace prefix 并说明定义的位置。然后允许 SVG 阅读器know what xlink:href means

IMAGE_DATA 是您将图像数据添加为 base64 编码文本的位置。支持 SVG 的矢量图形编辑器通常可以选择嵌入图像进行保存。否则,有很多工具可以将字节流编码到 base64 和从 base64 编码。

这是来自 SVG 测试套件的完整example


@Aleksandar 这是一个单独的问题,我相信您可以在此站点上找到答案(将某些内容编码为 base64 不是特定于 svg 的)。
@Erik - 假设我在同一个 svg 文件中有相同的图像重复一千次。我可以将 base64 数据放在一个地方并让图像从那里引用该数据吗?
@Erik - 没关系,我从这里得到了答案 - stackoverflow.com/questions/16685014/…。答案谈到在那里分组。 :)
不要忘记按原样声明命名空间 xlinkxmlns:xlink="http://www.w3.org/1999/xlink" 如果没有它,某些浏览器/查看器可能看不到您的图像
仅供参考:根据我的经验,即使您未在 svg 图片标签中指定 widthheight,Chrome 浏览器也会显示此图片。但是,如果您省略这些属性,Firefox 和 IE 将不会显示图像。因此,请确保指定它们!
d
davestewart

我在这里发布了一个小提琴,在 HTML 页面中显示嵌入在 SVG 中的数据、远程和本地图像:

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>

G
GarethOwen

您可以使用 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,那么这可能没有缺点 - 我将编辑我的答案
嵌入的图像(数据 URI)将与它们所在的文档一起缓存,例如 stackoverflow.com/questions/4791807/data-uris-and-caching
完全正确 - 如果 svg 文档发生更改,嵌入的位图将被重新加载,即使它是相同的。如果我们链接到一个 http URL,它可以单独缓存到 svg 文档中。
好点子。在我对尼克的回答的评论中,您会看到将位图图像嵌入到 svg 图像中的合理性。虽然你是对的,但编码很糟糕而且效率低下。它应该是与 svg 图像一起移动的单独的二进制编码文件。
N
Nick

您可以使用 data: URL 嵌入图像的 Base64 编码版本。但它不是很有效,不建议嵌入大图像。链接到另一个文件的任何原因是不可行的?


这取决于用例。我正在考虑的用例是复制 svg 文件并且互联网访问并不总是可用(即名片)的地方。 IT 还允许对卡的使用保密。使用链接的图像,图像的所有者可以跟踪其卡片的所有显示,这可能对他来说是有趣的,但对于持卡人来说却不是。自包含 svg 图像是有意义的。
如果您使用指向 Internet 上某处的绝对 URL,则确实如此。但是使用相对 URL 很容易,因此如果 SVG 文件是本地的,那么图像也会是本地的。如果您还要求它必须是一个可再分发的文件,那么这会再次改变。
在某些用例中,您希望 SVG 图形是自包含的 - 即一个包含整个图像的文件。在文件系统上处理图像时,必须传输/存储多个文件以确保渲染图像并不是一件好事——事情可能会不同步或太容易丢失。
m
mightyplow

也可以包括位图。我认为您也可以对此使用转换。


的确。我刚刚找到了这个链接:w3.org/TR/SVG/struct.html#ImageElement。不幸的是,它没有回答我注意到问题中没有说明的问题。我将编辑问题。
A
Alex Szücs

如果您想在 SVG (Ref.) 中多次使用该图像:

<image id="img" xlink:href="data:image/png;base64,BASE64_DATA" />

<use href="#img" />
<use href="#img" />