yano3nora
7/2/2017 - 11:20 AM

[html: inline image] 画像をバイナリ(base64)にしてページに埋め込む - インラインイメージといふやりかた #html #php

[html: inline image] 画像をバイナリ(base64)にしてページに埋め込む - インラインイメージといふやりかた #html #php

どういうことなの

めっちゃ早くなる!ってわけでもないです。 DOMの一部にしちゃうってことなので、画像ロードまでの待ち時間に表示されるアイコンてきな使い方がよいのかな?

http://dev.classmethod.jp/ria/image-performance-tuning-03/

何が嬉しいの

インラインイメージを使うことで画像自体のHTTPリクエストが発生しません。 例えばファイルサイズの小さな10個の画像を読み込んでいるとします。それらすべてをインラインイメージ化することで10回のHTTPリクエストを削減できます。

何が悲しいの

  • IEの古いバージョンでは使えない
  • エンコードによりデータサイズが約37%増加す
  • 画像変更の度に差し替えが必要
  • キャッシュされない(data URI scheme利用時)
  • 同じ画像を複数箇所に表示したい場合は向かない

やりかた

// html
<img src="data:image/png;base64,iVBORw0KGg.....">

// css
 background: url("data:image/png;base64,iVBORw0KGg....");

php で動的にエンコード

PHPやRubyで動的にエンコードし埋め込むことで画像の差し替えにも対応できます。PHPの場合file_get_contentsとbase64_encodeを組み合わせることで実現できます。 うまくキャッシュを利用できるとさらに良いでしょう。

こつ

まず、前提として対象ブラウザがIE8以上であること。さらにデータ量が37%増加するので、大きなサイズの画像は利用しない方が良いでしょう。 また、CSSに埋め込むことでキャッシュを活用したり、gzip圧縮することで転送時のファイルサイズを小さくすることができます。

  • ページ内で1度しか使わない画像の場合HTMLにインライン埋め込み
  • 装飾としてしか意味を持たない場合はCSSのbackgroundに埋め込み
  • 複数箇所で利用したい場合はCSSのbackgroundに埋め込んでクラスで指定