CSS: Data URI Scheme, Base64 Encoding

, , …,
Want to master JavaScript in a week? Buy Xah JavaScript Tutorial.

If you have lots tiny images in CSS, it'll make your site slow, because each HTTP request introduces latency.

CSS Google Plus Twitter Facebook icon link-2
Link with favicons, Twitter, Facebook, Google Plus

One way to solve this problem is to use what's called “Data URI Scheme”. Basically, you encode your image and embed it in your CSS file.

For example, suppose this is your CSS:

a[href*="twitter.com/"] {
background:url(https://twitter.com/favicon.ico) no-repeat left center;
padding-left:19px
}

this will match links to Twitter and add a icon in front of the link. 〔➤ CSS 3 Selector Syntax

You can encode it like this:

a[href*="twitter.com/"] {
background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAACXBIWXMAAABIAAAASABGyWs+AAAApVBMVEX////////////////u9/r////////////////////O5/Dv+f3P6vTP7fi+5PPe9PzO7fmez+HP7/ue0OOOx92v5Pie2/N+v9ie3PSe3/hvvNlgsM9+0/R+1fZPqcxfy/RAoMVQxfNArNY/tuMvmsMvuO0wvPEfkr4QiLYQi7oPrOgPsO4Aib0AkckAlMwAltAAmdQAnNgAn9sAod8ApOMAqeoArO7zdD6kAAAALHRSTlMAAwcMDw8UGB8oMD9CVldXWmBgYnB4foGBiZSfn6Gxtr/CxcrQ29vg7u7z8yG5/9UAAAABYktHRACIBR1IAAAAfklEQVQYGY3B6QKBQBgF0JsZKtmyk+zGkpDlvv+j+Wbif+cAFWhYejiJoTXEMobY3+75+jiA2OWJRvNN8nVpQYxZnJM5rZGC2JKf4kGrAaud8cfAUYuMpSlKnQMd46NU720oTARHJ6frk+Qq8uB4YT9N01k39PCngiDwa6jqCz6DEH0t5c9eAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDEzLTA3LTIwVDA0OjA2OjAxLTA3OjAw/V0jwgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMy0wNy0yMFQwNDowNjowMS0wNzowMIwAm34AAAAASUVORK5CYII=)
no-repeat left center;
padding-left:19px
}

Inside the background:url(…) is the data URI.

The first part data:image/png;base64, is the MIME type followed by a comma.

The rest string is base64 encoded data of the image.

How to Convert Image to Base64 Encoding

First, if the image is “ico” format, best to convert to png. You can use ImageMagick, like this:

# convert to png using imagemagic
convert favicon.ico favicon.png

〔➤ ImageMagick/GraphicsMagick Tutorial

Then, you should optimize the png file, make the file size smaller. You can use the program “optipng”.

# optimize the png, makes the file size smaller
optipng favicon.png

Now, you have a optimized png file.

Let's suppose the image we want to base64 encode is named “my_img.png”.

Linux Shell

On Linux, you can use the command base64, like this:

base64 my_img.png | tr --delete '\n' > output.txt

PHP

<?php
echo base64_encode(file_get_contents("my_img.png"));
?>

Python

print open("my_img.png", "rb").read().encode("base64").replace("\n", "")

Python 3

import base64
print(base64.b64encode( open("my_img.png","rb").read() ).decode("ascii"))

Ruby 1.9

require "base64"
print Base64.strict_encode64(File.open("my_img.png", "rb").read)

Perl

use MIME::Base64 qw(encode_base64);
 
open FH, '<', 'my_img.png';
read(FH, $contents, 10000000);
print encode_base64($contents, "");

JavaScript (node.js)

var fs = require('fs');
console.log( fs.readFileSync('my_img.png').toString('base64') );

Reference

Data URI scheme @ http://tools.ietf.org/html/rfc2397

blog comments powered by Disqus