元画像を変更せずに画像をグレースケールで表示する
公開:
更新:
タイトル通りなんですが、画像を1枚だけ用意して、それをカラーで使ったりグレースケールで使ったりしたいわけです。
IEには最初からフィルタが用意されていますが、クロスブラウザにできないかと思って調べてみました。
結果、何種類かあったので、デモを作ってみました。
元画像を変更せずに画像をグレースケールで表示する デモページ グレースケールにしたいセレクタにこれを指定すればおっけー。 Firefox 3.5以上にしか使えないっぽいですが、SVGでフィルタを作って、それをCSSで指定します。 FirefoxでHTML内で使えるSVGエフェクトについては以下のページを参照してください。 これの解説は色んなところにありますが、一番分かりやすかったページを参考にしました。 IE以外のモダンブラウザはHTML5の この方法のいいところは、IE以外のブラウザ(の最新版)なら、どれでも動くことです。 ただし、ピクセルごとに変換するということは、画像が大きかったり多かったりすると、とても遅くなるということです。IE用の指定
filter: progid:DXImageTransform.Microsoft.BasicImage(grayscale=1);
SVGフィルタを使う
これは『Stack Overflow』にあった質問と回答からの引用です。canvas
を使ってグレースケールにしてData URIに変換canvas
要素をサポートしているので、それを使ってピクセルごとにグレースケールに変換する、という方法です。
引用元ページではjQueryを使ってブラウザを判別し、IEならフィルタ、それ以外ならcanvasという感じで分岐させていました。
※分岐しないとIE 8でエラー出ます。
画像をいっぱい用意してやってみると分かりやすいと思います。
調べた結果、上記の3種類になったわけですが、クロスブラウザにするには1番目と3番目を組み合わせるしかないっぽいです。
重いという点に目をつぶれば、ですが。
よほどの事情がない限りは最初からグレースケールにした画像を用意する方がよさそうですね。残念。