透過画像で可能な最小のデータURI画像


125

スプライトを使用し、一部のアイコンに代替テキストを提供できるように、背景画像付きの透明な1x1画像を使用しています。

画像のデータURIを使用してHTTPリクエストの数を減らしたいのですが、透明な画像を作成するために可能な最小の文字列は何ですか?

スプライトの代わりに実際の画像にデータURI:を使用できることはわかっていますが、すべてを散らばるのではなくCSSに保持すると、維持が簡単になります。


1
キャッシュを設定して、実際の1x1画像を使用する方が良いのではないでしょうか。これ以上のhttpリクエストはなく、データオーバーヘッド全体で、画像へのURLは78バイトのデータURIよりも小さい可能性があります。
Redzarf 2013

1
@Redzarf:実際には、おそらくそれは良くないでしょう。小さく、めったに変更されないリソースは、ファイルサイズのためではなく、HTTP要求のラウンドトリップのために、ページの読み込み時間に影響を与えます。もう1つの微妙な点は、ほとんどのブラウザーは他のリソースよりもCSSをキャッシュすることに積極的であるため、ブラウザーがCSS(およびこのように埋め込まれたコンテンツ)の更新を試す可能性が低くなり、httpラウンドトリップを節約できることです。
SingleNegationElimination 2014

回答:


167

さまざまな透明GIFで遊んだ後、一部が不安定になり、CSSグリッチが発生します。たとえば、があり、<img>可能な限り小さな透明GIFを使用している場合は正常に動作しますが、透明GIFにを設定したい場合background-image、これは不可能です。何らかの理由で、次のような一部のGIFはCSSの背景(一部のブラウザー)を妨げます。

より短い(ただし不安定-74バイト)

data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==

次のように、少し長くて安定したバージョンを使用することをお勧めします。

⇊安定している⇊(やや長い-78バイト)

data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7

別のヒントimage/gifとして、1つのコメントが示唆しているように省略しないでください。これはいくつかのブラウザで壊れます。


1
+1ありがとうございます!これが重宝していることに気づきました。私はあなたのデータを使用してこのプラグインを作成し、レスポンシブタイプの画像をバックグラウンドカバーでネイティブに使用したり、github.com
Jason Sebring

1
短い方が「不安定」なのはなぜですか?時々黒い画像が表示されるようですが、誰かがその理由を知っているかどうか知りたいだけです。
jvenema

多くの苦痛の後、実際には、「より短い」バージョンが実際に古いAndroidブラウザー(HTC One S、OS 4.1)上のサイトの一部(すべてではない)のページでブラウザーをクラッシュさせていたことがわかりました。
WebSeed 2016

素晴らしい答えですが、これまでのところ可能な限り最小ではありません。
Josh Habdas

22
data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg'/%3E

最終的な長さは、gzipされたものによって異なります。


3
SVGの使用に反対する議論はありますか?それが良い考えではない場合はありますか?
2017年

SVGは多くの場合問題ありませんが、と組み合わせるとwidth: auto;、SVGはその親の幅になります。GIFやPNGなどの静的画像は、高さと幅が固定されている場合、縦横比が維持されます。
snazzybouche


14

最小のPNG-114バイト:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVQYV2NgYAAAAAMAAWgmWQ0AAAAASUVORK5CYII=

これはGIMPを使用して簡単に生成できることを言及する価値があります。結果のファイルのサイズは68バイトになります(これまでのところ最小のサイズ)。
Ismael Miguel

@AminahNurainiこれはPNGです。
joshcarr 2016年

2
@AminahNuraini:この答えはあなたに「SVG」と言っていますか?
オービットの軽度のレース

10

この男は、GIF仕様を介して問題を分解します。の彼の解決策はtransparent.gif37バイトでしょう:

data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==

彼はまず透明度を取り除き、次にカラーテーブルを削除することでさらに小さくなりました...


GIF89a仕様

  • ヘッダー(6バイト)

    バイト「GIF」とバージョン番号(通常は)で構成されます89a

  • 論理画面記述子(7バイト)

    詳細は省きますが、ファイルのこのセクションでは次のことを示しています。

    • ファイルのサイズは1x1ピクセルです。
    • グローバルカラーテーブルがあります。
    • グローバルカラーテーブルには2つの色があります。2番目の色は背景色として使用する必要があります。
  • グローバルカラーテーブル(6バイト)

    色ごとに3バイト、赤、緑、青のそれぞれ1バイトで構成されます。このファイルでは、最初の色は白、2番目の色は黒です。

  • グラフィック制御拡張(8バイト)

    カラーテーブルの2番目の色を透明として扱う必要があることを示すために使用されます(アニメーションパラメータにも使用できますが、このファイルにはありません)。

  • 画像記述子(10バイト)

    GIFファイルには実際に複数の「画像」を含めることができます。これにより、背景色と同じ色の部分の画像データを指定する必要がなくなります。各画像ブロックには、全体の画像サイズ内の位置とサイズがあります。上記のファイルでは、位置は0,0で、サイズは1x1です。

  • 画像データ(5バイト)

    LZWでエンコードされた画像データの1つのブロック。画像に含まれる単一のピクセルを表すには5バイトかかります。圧縮アルゴリズムは、1バイトを適切に圧縮するようには設計されていません。

  • GIFトレーラー(1バイト)

    16進数値3B;ASCII)の1バイトは、GIFの終わりを示します。

透明なGIFに必要な構造に基づいて、43バイトはあなたが得ることができる限りかなり小さいことがわかります。

しかし、私はそれを少し小さくするための1つのトリックを理解することができました。標準では、グローバルカラーテーブルを持つことはオプションであると述べられています。もちろん、カラーテーブルなしでGIFを作成するとどうなるかは未定義です。

ただし、透明として定義されたカラーテーブルインデックスがある場合、GIFデコーダーは実際にはカラーテーブルが存在しないことを気にしません。

そこで、論理画面記述子を変更してグローバルカラーテーブルがないことを示し、テーブル自体を削除して合計6バイトを節約し、ファイルサイズをわずか37バイトに減らしました。

興味深いことに、FirefoxとGIMPの両方が開いて表示されている(透明な場合は「表示」されている)にもかかわらず、Wordpressから、GDが有効なGIFファイルではないというエラーメッセージが表示されました。大丈夫。

さらに小さくするために、私は画像内に残っている最大の「オプション」ブロックであるグラフィックコントロール拡張機能に注目しました。透過性が必要ない場合は、このブロックは不要になり、それを8バイト取ります。

出典:これまでで最も小さなGIF


1
その記事によれば、37バイトのバリエーションは未定義の動作に依存しており、実際に著者はwordpressの画像パーサーはそれを処理できないと述べています。ほとんどのブラウザで動作する可能性がありますが、危険な選択だと思います。同じ記事の43バイトのバリエーションを使用します。そのバリエーションはすでに上に掲載されています上の回答の
ブライアン

9

次のSVGデータ(60バイト)を試すことができます。

data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg"/>

スタンドアロンsvgファイルは次のようになります(62バイト):

<?xml version="1.0"?><svg xmlns="http://www.w3.org/2000/svg"/>

以下も参照してください。


2
こと できる エンコードとファビコンやCSSで使用されるcontentプロパティ。
Josh Habdas

6

これは私が見つけた最小のものです(26バイト):

data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=

これはIE11で真っ黒になります。
tomasz86 2016

4

次のデータURIを使用して空の画像を取得しています。 //:0


Firefox 44とInternet Explorer 11はimg altタグを表示します。上記のいずれかを使用するか、altタグを削除する必要があります
PersyJack

これは画像のリクエスト/レスポンスよりも効率的ですか?
nu everest 2018年

検証しない
Lucian Davidescu

0

空の画像の場合:

data:null

(それはに翻訳されますsrc=(unknown)


原則としてこれが好きですが、実際にはw3cバリデーターは承認しません。
brennanyoung
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.