2017-02-22 10 views
2

キャンバスに画像を描画する前にCSSフィルタを追加しようとしています。これは私のJavaScriptです。キャンバスに描画する前に画像にフィルタを追加する

img = new Image(); 
    img.src = "picture.png"; 
    img.crossOrigin = "Anonymous"; 
    img.style="filter: saturate(8);"; 

    context = canvas.getContext('2d'); 
    context.lineJoin = "round"; 
    context.lineWidth = cursorSize; 
    img.onload = function() { 
     context = canvas.getContext('2d'); 
     context.drawImage(this, 0,0,width,height); 
     layer.draw(); 
    }; 

このイメージをキャンバス以外のものに読み込むと、正しくレンダリングされます。しかし、私はキャンバスに飽和した画像が見えません。何か不足していますか?ありがとうございました。

答えて

6

CSSフィルタはイメージ要素の上にあり、イメージ自体の一部ではないため、キャンバスに描画するときはビットマップのみが使用されます。

幸いにも、一部のブラウザでは、コンテキスト自体のCSSフィルタがサポートされています。単純に(明確にするために減少コードで)このようなコンテキストに画像上のCSSフィルタの行を下に移動:

var context = canvas.getContext('2d'); 
var img = new Image(); 
img.onload = function() { 
    context.filter = "saturate(8)";   // use CSS filter here 
    context.drawImage(this, 0, 0, width, height); 
    context.filter = "none";     // reset filter 
}; 
img.src = "picture.png"; 

注:すべてのブラウザでサポートされていない場合、フィルタは、手動で適用されなければならないとスクラッチから。

+0

画像を描いた後でフィルタを設定する方法はありますか? –

+0

@AlexKonetchyキャンバス自体を再描画するだけです。イメージをそのまま描画し、フィルタプロパティを設定し、globalCompositeOperationをコピーするように設定し(アルファチャンネルが含まれている場合)、画像ソースとしてキャンバスにdrawImageを使用します。 – K3N

+0

さて、それはとても近いですが、フィルタを切り替える方法はありますか?私は3回イメージを再描画しています。フィルターなしで初めて。 2回目はフィルターを使います。 3回目にキャンバスをコピーして描画するとき、フィルタなしの元の画像と同じように描画しますが、フィルタを設定するたびに2回目に設定します。キャンバスは私にとってとても新しいものです。 –

関連する問題