※本記事は解決していない内容のメモです。
svgからBlobを生成すると、imgに直接画像を入れたりcssの画像URLとして取り扱ったりできる。その中でぼかし効果のあるフィルターを適用していたところ、Chromeでは適用されるのにFirefoxでは適用されなかった。「feGaussianBlur blob firefox」とかで検索しても関係しそうなWebページが見つからなかったので、メモを残す。
以下は左がChromeで右がFirefoxのスクリーンショット。svgのコードではChromeもFirefoxも正しくレンダリングされて、2つ並んだ丸のうち右側の丸がぼやけている。しかし、Blobに変換した後にimgタグのsrc属性として指定したところ、適用されていたフィルターが適用されなくなってしまった。おかしいなと思って他のフィルターを適用してみたけれど、やはり反映されない。
おそらくBlobに変換するタイミングでフィルターが適用されなくなっているんだけど、何かよい回避策がないか探している状態。
以下、今回の実験に使ったコード。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>filter test</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> </head> <body> <h1>Gaussian Blur</h1> <div> <p> <a href="https://developer.mozilla.org/ja/docs/Web/SVG/Element/feGaussianBlur"> https://developer.mozilla.org/ja/docs/Web/SVG/Element/feGaussianBlur </a> </p> <h2>svg</h2> <div id="svg-container1"> <svg width="230" height="120" xmlns="http://www.w3.org/2000/svg"> <filter id="blurMe"> <feGaussianBlur in="SourceGraphic" stdDeviation="5" /> </filter> <circle cx="60" cy="60" r="50" fill="green" /> <circle cx="170" cy="60" r="50" fill="green" filter="url(#blurMe)" /> </svg> </div> <hr> <h2>Blob result</h2> <img id="result1"> </div> <hr> <h1>Other filter</h1> <div> <p> <a href="https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feColorMatrix"> https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feColorMatrix </a> </p> <h2>svg</h2> <div id="svg-container2"> <svg width="230" height="120" xmlns="http://www.w3.org/2000/svg"> <filter id="hueMe"> <feColorMatrix in="SourceGraphic" type="hueRotate" values="90" /> </filter> <circle cx="60" cy="60" r="50" fill="green" /> <circle cx="170" cy="60" r="50" fill="green" filter="url(#hueMe)" /> </svg> </div> <hr> <h2>Blob result</h2> <img id="result2"> </div> <script> $(function () { var data, DOMURL, svg, url; // Gaussian Blur data = $("#svg-container1").html(); DOMURL = window.URL || window.webkitURL || window; svg = new window.Blob([data], { type : "image/svg+xml;charset=utf-8" }); url = DOMURL.createObjectURL(svg); $("#result1").attr("src", url); // Other filter var data = $("#svg-container2").html(); var DOMURL = window.URL || window.webkitURL || window; var svg = new window.Blob([data], { type : "image/svg+xml;charset=utf-8" }); var url = DOMURL.createObjectURL(svg); $("#result2").attr("src", url); }); </script> </body> </html>
追記:
DOMにこだわらないでCanvasで描いてしまった方が早かった。解決。