HTMLのみで画像のリサイズを行いたい

HTMLで画像を表示する場合。

サイズが 200x100ピクセルの画像を表示したい場合はこんな感じに書く。

<img src="./foo.png" alt="Foo" width="200" height="100" />

width/height属性に別の値を指定すると、画像をリサイズして表示させる事ができる。例えばサムネール表示なんかに利用できる。

<img src="./foo.png" alt="Foo" width="100" height="50" />
<img src="./foo.png" alt="Foo" width="100" />

しかし、ブラウザでのリサイズは品質がよくないイメージがあり、大抵はあらかじめ縮小しておいたイメージを用意しておくことが多いように思う。あとはアップロード時に自動的に作成するとか。

オリジナルの画像とは別にサムネールの画像があるのは無駄な気がする。最近のブラウザではリサイズの品質がよくなっているかもしれない。調べてみた。

リサイズの方法

最近のブラウザでは画像リサイズの方法がいくつかあるので整理。

width/height属性
width/height属性指定によるリサイズ
CSSのwidth/height
スタイルシートのwidth/heightプロパティによるリサイズ
CSSのzoom
スタイルシートのzoomプロパティによる指定(IEの独自実装)
CSSのtransform
スタイルシートのtransformプロパティによる指定
canvas要素
canvas要素にリサイズして描画

最後のはちょっと違う気もするが気にしない。canvas未対応のIEexcanvas.jsで。

実験

縦横32ピクセルのこんな画像を用意。

画像のタイプとか透過とかアルファチャンネルとかも影響するかもしれないので、以下の4種類を用意。

8bit GIF
右半分の背景を透過指定
8bit PNG
右半分の背景を透過指定
32bit PNG
上の右側の背景を透過指定&下の背景を白から透明のグラデーション
24bit JPEG
透過なし

拡大縮小率は50%/67%/131%/200%。等倍だと最適化が働くかもしれないので中途半端な率もいれておく。それと幅/高さが違う倍率の場合も調べる。

実験ページ。別ドメイン。要JavaScript。

結果

以下のOS+ブラウザでチェックしてみた。ブラウザの名前クリックで結果を画像で表示(別ドメイン)。結構重いかも。

IE6で32bit pngが変な表示なのはしょうがないこと。

IE8はなんかちゃんと表示されない。zoom:2.0が4倍くらいになってる。excanvasは単に対応していないっぽい。あとで調べる。

Gimpのカラープロファイル対応がよくわからなくてスナップ作成に手間がかかった。これもあとで調べる。

まとめ

  • 画像の形式とかあんまり関係ない
  • 拡大率とかあんまり関係ない
  • Macでは全体的に補間がかかり品質もよい
  • WindowsXPでは古いブラウザだと補間がかからない
  • Win+OperaJPEGだけ補間がかかってる
  • Safari 4 Betaではzoomプロパティが有効
  • canvas要素(とIEVML)はだいたい補間がかかる

HTMLのみで画像のリサイズを行う、ということに関してはIE8が普及するまではあんまり現実的ではなさそう。シェアの大きいIE6/IE7がネック。canvas要素をわざわざ使うのもどうかと思うし。

やり残し

  • Windows Vistaは持っていないのでわからない
  • IEには「画像を滑らかにする」という設定があったのを今さらみつけた
  • ハードウェアも影響する?WindowsXPVirtualBox上で見たから低スペックだったのかも
  • Firefoxのimages.ditherは関係する?
  • ブラウザの拡大縮小機能は?
  • 大きい画像の自動縮小機能は?