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未対応のIEはexcanvas.jsで。
実験
縦横32ピクセルのこんな画像を用意。
画像のタイプとか透過とかアルファチャンネルとかも影響するかもしれないので、以下の4種類を用意。
拡大縮小率は50%/67%/131%/200%。等倍だと最適化が働くかもしれないので中途半端な率もいれておく。それと幅/高さが違う倍率の場合も調べる。
結果
以下のOS+ブラウザでチェックしてみた。ブラウザの名前クリックで結果を画像で表示(別ドメイン)。結構重いかも。
- Mac OS X 10.5.6(Leopard)
- Windows XP
IE6で32bit pngが変な表示なのはしょうがないこと。
IE8はなんかちゃんと表示されない。zoom:2.0が4倍くらいになってる。excanvasは単に対応していないっぽい。あとで調べる。
Gimpのカラープロファイル対応がよくわからなくてスナップ作成に手間がかかった。これもあとで調べる。
まとめ
- 画像の形式とかあんまり関係ない
- 拡大率とかあんまり関係ない
- Macでは全体的に補間がかかり品質もよい
- WindowsXPでは古いブラウザだと補間がかからない
- Win+OperaはJPEGだけ補間がかかってる
- Safari 4 Betaではzoomプロパティが有効
- canvas要素(とIEのVML)はだいたい補間がかかる
HTMLのみで画像のリサイズを行う、ということに関してはIE8が普及するまではあんまり現実的ではなさそう。シェアの大きいIE6/IE7がネック。canvas要素をわざわざ使うのもどうかと思うし。
やり残し
- Windows Vistaは持っていないのでわからない
- IEには「画像を滑らかにする」という設定があったのを今さらみつけた
- ハードウェアも影響する?WindowsXPはVirtualBox上で見たから低スペックだったのかも
- Firefoxのimages.ditherは関係する?
- ブラウザの拡大縮小機能は?
- 大きい画像の自動縮小機能は?