3

目標: html5 と JavaScript を使用して CSS フィルターをビデオに適用します。

制約:ソリューションはInternet Exporer 10 (Windows 8 用)と互換性がある必要があります。私は実際に Metro アプリを作成しています。

これまでのところ:<video>ポンピングしている があり<canvas>ます。これに CSS フィルターを直接適用できると思っていましたが (例:invertbrightness)、それらは IE10 と互換性がないことが判明しました。

考え: SVG フィルターをキャンバスに適用する方法を望んでいます。これは可能ですか?を にコピーしてフィルタを適用する必要が<canvas>あり<image>ますか? または、キャンバスをラップする方法はあり<foreignObject>ますか?

お世話になりました!

興味のある方向けのコードを次に示します。

フィルター.svg:

<?xml version="1.0" standalone="no"?>
<svg width="1" height="1" version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
  <defs>
    <filter id="blur">
      <feGaussianBlur in="SourceGraphic" stdDeviation="2 3" />
    </filter>
  </defs>
</svg>

スタイル.css:

.a {
    filter: url(filter.svg#blur);
    -ms-transform: matrix(-1, 0, 0, 1, 0, 0);
}

page.html:

<div class="itemtemplate" data-win-control="WinJS.Binding.Template">
            <canvas class="a" style="width: 180px;height:180px;margin-bottom: -5px;" data-win-bind="style.backgroundColor: bc; id: effectId" />
</div>

次のコードは、非常にゆっくりではありますが、私の目標を達成するために機能しますありがとう、アンソニー!

<html>
<head>

</head>
<body>
<svg id="svgroot"  viewbox="0 0 800 800" width="800" height="800"  preserveAspectRatio="xMidYMin">
    <defs>
<filter id="myHueRotate">
<feColorMatrix type="hueRotate" values="270"/>
</filter>
</defs>
<image id="a" filter="url(#myHueRotate)"  x="0" y="0" width="300" height="300" />
<image id="b" filter="url(#myHueRotate)"  x="300" y="0" width="300" height="300" />
<image id="c" filter="url(#myHueRotate)"  x="0" y="300" width="300" height="300" />
<image id="d" filter="url(#myHueRotate)"  x="300" y="300" width="300" height="300" />
</svg>
<canvas id="canvas" height="300" width="300"></canvas>
<video id="vid" src="movie.m4v" height="300" width="300" style="display: none" autoplay/>


<script>
  var ctx = document.getElementById('canvas').getContext('2d');
  var img = new Image();
  img.src = 'img.jpg';
  img.onload = function(){
    //ctx.drawImage(img,0,0);
    //var canvasImage = canvas.toDataURL("image/png");
    //var svgImage = document.getElementById('a');
    //svgImage.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href", canvasImage);
    draw();
  }
img.load();

function draw(){
    var ctx = document.getElementById('canvas').getContext('2d');
    var vid = document.getElementById('vid')
    ctx.drawImage(vid,0,0,300,300);
    var canvasImage = canvas.toDataURL("image/png");
    document.getElementById('a').setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href", canvasImage);
    document.getElementById('b').setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href", canvasImage);
    document.getElementById('c').setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href", canvasImage);
    document.getElementById('d').setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href", canvasImage);
    setTimeout(draw,40);
}
</script>
</body>
</html>
4

1 に答える 1

6

まず、読むべき記事:

標準ベースの Web グラフィックスイン IE10 への移行

特に次のセクションに注意してください。

VML ではなく SVG を使用する

DX フィルターではなく、CSS3 を使用する

その 2 番目のセクションで、彼らは次のように述べています。

DX フィルターは SVG フィルター効果と同じではありませんが、どちらも CSS プロパティ名フィルターを使用します。

2 番目の記事:

フィルターとトランジションの概要

彼らは の使用方法の具体的な例を示していますが、それが IE でinvert方法であると仮定すると、見つけにくい理由がわかり、あなたのケースでは機能する場合と機能しない場合があります。ただし、css は次のようになります。

#yourTargetElement {
     filter: DXImageTransform.Microsoft.BasicImage(invert=1);
}

明るさについては言及していませんが、他のいくつかのフィルターとトランジションについて言及しており、最初の記事では SVG の使用について言及しています。詳細 (うまくいけば役に立つもの):

IE10 の SVG フィルター効果

これは、キーのパート 1 のように見えます。

フィルタは、filter="url(#filterId)" の形式で filter 属性を介して SVG 要素に適用されるか、CSS プロパティ filter:url(#filterId) として適用できます。

これはパート 2 です。

16 の異なるフィルター プリミティブがあります。

現在、彼らが参照している 16 は SVG のフルセットだと思いますが、MS を知っていると、次のいずれかを意味する可能性もあります。

  1. これらは、私たちがサポートする 16 です。
  2. これらは、IE 標準に準拠し、SVG/MathML に適したものにするという私たちの主張を継続するために発明した 16 ですが、他のどのブラウザーよりも難しくしています...なぜなら、できるからです.

または、Lily Tomlin の言葉を引用すると、「私たちは気にしません。気にする必要はありません...私たちは電話会社です。」

しかし、MS が最終的に追いつく必要があることに気づき、16 個のプリミティブ フィルターをさらに読んで、適切な場所にフィルターを配置した埋め込み SVG があり ( defs)、css を介してそれらを呼び出すと仮定します。これは彼らの例の1つです(私が少し変更して単純化しました):

SVG が埋め込まれた HTML:

<div id="svg_wrapper">
<svg xmlns="http://www.w3.org/2000/svg" id="svgroot" viewBox="0 0 800 533" preserveAspectRatio="xMidYMin">
    <defs>
     <filter id="filtersPicture">
             <feComposite operator="arithmetic" k1="0" k2="1" k3="0" k4="0" 
               in="SourceGraphic" in2="SourceGraphic" result="inputTo_6">
             </feComposite>      
             <feColorMatrix type="saturate" id="filter_6" values="2" 
                            data-filterId="6">
             </feColorMatrix>
             </filter>
   </svg>
  </div>

CSS (JS を使用して動的にするため、注意してください):

<style type="text/css">
     #yourTargetElement{
             filter:url(#filtersPicture);
      }
 </style>

彼らがどのように「簡単」に見えるようにするかについて私が注意する理由は、jsとインタラクティブフォームを介してスタイルを追加しているためです(おそらく同じことを念頭に置いているでしょう)が、要素を呼び出すのと同じリスクがあると思いますフィルタを見つけることができず、エラーをスローするという点で、DOM にある前のスクリプト。したがって、シンプルに (非動的に) 維持したいのにまだ機能しない場合は、フィルター/svg をスタイルの上に配置してみてください (ちらつきが発生する場合でも)。

于 2012-05-26T13:22:59.093 に答える