Does SVG support embedding of bitmap images?

ImageSvgBitmapimage

Image Problem Overview


Is an SVG image purely vectorial or can we combine bitmap images into an SVG image ? How about transforms applied on the bitmap images (perspective, mappings, etc.) ?

Edit: Images may be included in an SVG by link reference. See http://www.w3.org/TR/SVG/struct.html#ImageElement. My question was in fact if bitmap images may be included inside the svg so that the svg image would be self contained. Otherwise, whenever the svg image is displayed the link must be followed and the image downloaded. Apparently .svg files are simply xml files.

Image Solutions


Solution 1 - Image

Yes, you can reference any image from the image element. And you can use data URIs to make the SVG self-contained. An example:

<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>

The svg element attribute xmlns:xlink declares xlink as a namespace prefix and says where the definition is. That then allows the SVG reader to know what xlink:href means.

The IMAGE_DATA is where you'd add the image data as base64-encoded text. Vector graphics editors that support SVG usually have an option for saving with images embedded. Otherwise there are plenty of tools around for encoding a byte stream to and from base64.

Here's a full example from the SVG testsuite.

Solution 2 - Image

I posted a fiddle here, showing data, remote and local images embedded in SVG, inside an HTML page:

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>

Solution 3 - Image

You could use a Data URI to supply the image data, for example:

<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>

The image will go through all normal svg transformations.

But this technique has disadvantages, for example the image will not be cached by the browser

Solution 4 - Image

You can use a data: URL to embed a Base64 encoded version of an image. But it's not very efficient and wouldn't recommend embedding large images. Any reason linking to another file is not feasible?

Solution 5 - Image

It is also possible to include bitmaps. I think you also can use transformations on that.

Solution 6 - Image

If you want to use that image multiple times inside SVG (Ref.):

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

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionchmikeView Question on Stackoverflow
Solution 1 - ImageErik DahlströmView Answer on Stackoverflow
Solution 2 - ImagedavestewartView Answer on Stackoverflow
Solution 3 - ImageGarethOwenView Answer on Stackoverflow
Solution 4 - ImageNickView Answer on Stackoverflow
Solution 5 - ImagemightyplowView Answer on Stackoverflow
Solution 6 - ImageAlex SzücsView Answer on Stackoverflow