4

白黒画像を2つのカスタムカラーの2色画像に変換するカスタムCSSフィルターを作成する必要があります。

このような方法でフィルターを適用したい(この構文が可能かどうかわからない、おそらく6つの引数を個別に渡す必要がある):

.duotone {
    -webkit-filter: custom(none url(/filters/duotone.fs),
        black_color [255, 0, 0] white_color [255, 192, 203]);
}

この場合、黒が赤に置き換えられ、白と透明色(背景)の両方がピンクに置き換えられ、灰色のすべての色合いが中間の色に置き換えられます(直線曲線を使用)。

たぶん、外部ファイルなしでCSSでフィルターを定義することさえ可能ですか?

このフィルターの用途は、実行時に黒/白のアイコンを色付きのアイコンに変換することです。

それを行う方法の例はほとんどありません。これは非常に一般的で、はるかに広い範囲のフィルターをカバーしており、仕様もそれほど簡単には理解できません。

誰かがこれまたは同様のことを行う作業フィルターを投稿できますか?または、少なくとも、私の状況に関連するColorMatrixのアプリケーションのより焦点を絞った例をいくつか指摘することができます。

4

2 に答える 2

3

アップデート:

これを行うには、CSSで-webkit-mask-imageを使用する必要があります。これは以前はWebkitのみでしたが、現在はw3ccss3になっています。

サポートはwebkitthoにあります。下位互換性を維持し、通常の黒いアイコンを表示するには、ブラウザにこの機能があるかどうかを識別する必要があります。modernizrを使用してアーカイブしました。

http://jsfiddle.net/kkobold/Zq5FZ/5/

古い答え:

私はあなたが探している結果だと信じています:

http://s7.postimage.org/vo5v33tuj/Screen_Shot_2013_02_03_at_11_28_46_PM.png

セピア色にフィルタリングしてから色相度を変更することでアーカイブできます。組み合わせが異なれば、結果も異なります。ただし、色相用の単純なカラーピッカーとセピア用のスライドを作成して、色の変化の強度を増減することができます。

およびCSS3のみ。

<div class="pull-left span4" >
<img src="/img/bw.jpg" style="-webkit-filter: sepia(0.0) hue-rotate(0deg);" width="300"/><br />
-webkit-filter: sepia(0) hue-rotate(0deg);
</div>
<div class="pull-left span4" >
<img src="/img/bw.jpg" style="-webkit-filter: sepia(0.8) hue-rotate(50deg);" width="300"/><br />
-webkit-filter: sepia(0.8) hue-rotate(50deg);
</div>
<div class="pull-left span4" >
<img src="/img/bw.jpg" style="-webkit-filter: sepia(0.8) hue-rotate(100deg);" width="300"/><br />
-webkit-filter: sepia(0.8) hue-rotate(100deg);
</div>
<div class="pull-left span4" >
<img src="/img/bw.jpg" style="-webkit-filter: sepia(0.8) hue-rotate(150deg);" width="300"/><br />
-webkit-filter: sepia(0.8) hue-rotate(150deg);
</div>
<div class="pull-left span4" >
<img src="/img/bw.jpg" style="-webkit-filter: sepia(0.8) hue-rotate(200deg);" width="300"/><br />
-webkit-filter: sepia(0.8) hue-rotate(200deg);
</div>
<div class="pull-left span4" >
<img src="/img/bw.jpg" style="-webkit-filter: sepia(0.8) hue-rotate(250deg);" width="300"/><br />
-webkit-filter: sepia(0.8) hue-rotate(250deg);
</div>
<div class="pull-left span4" >
<img src="/img/bw.jpg" style="-webkit-filter: sepia(0.8) hue-rotate(300deg);" width="300"/><br />
-webkit-filter: sepia(0.8) hue-rotate(300deg);
</div>
<div class="pull-left span4" >
<img src="/img/bw.jpg" style="-webkit-filter: sepia(0.8) hue-rotate(350deg);" width="300"/><br />
-webkit-filter: sepia(0.8) hue-rotate(350deg);
</div>
于 2013-02-04T01:32:45.123 に答える
3

ここでのパーティーには少し遅れましたが、私はあなたが探しているものを正確に実行するCSSカスタムフィルターを作成しました。すべてのコードは、GitHubのhttps://github.com/awgreenblatt/css-custom-filters/tree/master/duotoneにあります。

セキュリティ上の制限により、カスタムフィルターはピクセルを読み取ることができません。それらにのみ変換を適用できます。したがって、たとえば、フィルタは、ピクセルが黒の場合、それを赤に変更することを言うことができません。ただし、それを行う方法はまだあります。

各色成分の範囲は[0,1]です。ソース画像のすべての白いピクセルは(1、1、1、1)になり、ソース画像のすべての黒いピクセルは(0、0、0、1)になります。

黒をマップする色を(br、bg、bb、1)と呼び、白をマップする色を(wr、wg、wb、1)と呼びましょう。

フラグメントシェーダーで、ソース画像に変換を適用するcss_ColorMatrixを定義できます。ブレンドモードを「乗算」に設定すると、css_ColorMatrixは現在のソース画像の色で事前に乗算されます。

したがって、css_ColorMatrixを次のように設定します。

wr - br,       0,       0,     0,
      0, wg - bg,       0,     0,
      0,       0, wb - bb,     0,
     br,      bg,      bb,     1

ソースピクセルが黒(0、0、0、1)の場合、乗算の結果は(br、bg、bb、1)になります。ソースピクセルが白(1、1、1、1)の場合、乗算の結果は次のようになります

((wr-br + br)、(wg-bg + bg)、(wb-bb + bb)、1)または(wr、wg、wb、1)

フラグメントシェーダーのソースは次のとおりです。

precision mediump float;

uniform vec3 black;
uniform vec3 white;

// Main

void main()
{
  vec3 b = black / 255.0;
  vec3 w = white / 255.0;

  css_ColorMatrix = mat4(w.r-b.r, 0.0, 0.0, 0.0,
                         0.0, w.g - b.g, 0.0, 0.0,
                         0.0, 0.0, w.b - b.b, 0.0,
                         b.r, b.g, b.b, 1.0);
}

頂点シェーダーはデフォルトです。

precision mediump float;

// Built-in attributes

attribute vec4 a_position;

// Built-in uniforms

uniform mat4 u_projectionMatrix;

// Main

void main()
{
  gl_Position = u_projectionMatrix * a_position;
}

そして、次のようにフィルターを適用します。

-webkit-filter: custom(url(duotone.vs) mix(url(duotone.fs) normal source-atop), 
             1 1 border-box, black 255 0 0, white 255 192 203);
于 2013-05-30T05:38:49.633 に答える