【问题标题】:Does SVG support embedding of bitmap images?SVG 是否支持嵌入位图图像?
【发布时间】:2011-09-09 03:08:14
【问题描述】:

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

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

【问题讨论】:

    标签: image svg bitmapimage


    【解决方案1】:

    是的,您可以引用 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 将不会显示图像。因此,请务必指定它们!
    【解决方案2】:

    我在这里发布了一个小提琴,在 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>
    

    【讨论】:

      【解决方案3】:

      您可以使用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 图像一起移动的单独的二进制编码文件。
      【解决方案4】:

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

      【讨论】:

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

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

      【讨论】:

      【解决方案6】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-10
        相关资源
        最近更新 更多