SVGフィルタで変更された画像をドロップシャドーにエクスポートしようとしています。 CSSの代わりにSVGフィルタを使用していますが、これはCSSが現在サポートしていないシャドウスプレッド機能のためです。残念ながら、キャンバスはシャドウスプレッド機能のようなフォトショップもサポートしていません。キャンバスはイメージを書きますが、SVGフィルタは含まず、キャンバス固有のシャドウフィルタのみを含みます。フィルタをHTML5キャンバスに実装したSVG
最後の目標は、フィルタを組み込んだJPEG画像を書き出すことです。したがって、SVG> Canvas> Imageになります。
私の質問は画像を描画するときにSVGフィルタを組み込むためにどのようにキャンバスをトリックするのですか?
これまで私がこれまで持っていたことは次のとおりです。
イメージ・HTML:
<img ng-src="logo.png" style="-webkit-filter: url("#logo-filter"); filter: url("#logo-filter");" />
SVGフィルタ設定:
<svg>
<defs>
<filter id="logo-filter" x="0" y="0" width="200%" height="200%">
<feFlood result="flood" flood-color="#00FFFF" flood-opacity="1"></feFlood>
<feComposite in="flood" result="mask" in2="SourceGraphic" operator="in" />
<feOffset in="mask" result="offset" dx="10" dy="10" />
<feGaussianBlur in="offset" result="blurred" stdDeviation="3" />
<feComponentTransfer>
<feFuncA type="gamma" exponent="0.5" amplitude="3" in="blurred" result="blurred2" />
</feComponentTransfer>
<feMerge>
<feMergeNode in="blurred2"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
</defs>
</svg>
キャンバスの実装:私は自分の質問への答えを考え出した
function plotLogo(img, logo, container) {
var canvas = document.getElementById("logo-canvas");
var position = getOffset($('#'+container.id+'-logo'));
var logo_image = new Image();
logo_image.src = img;
logo_image.onload = function(){
canvas.width = container.width;
canvas.height = container.height;
var context = canvas.getContext('2d');
/* StackOverflow Comment: Works but with no shadow spread */
context.shadowOffsetX = logo.shadow.offsetX;
context.shadowOffsetY = logo.shadow.offsetY;
context.shadowColor = logo.shadow.color;
context.shadowBlur = logo.shadow.blur*2; //Multiplied by 2 to get closest look to webkit shadow
context.drawImage(logo_image, position.posX, position.posY, logo.width, logo.height);
};
}