! あなたはそれを行うことができます! 後処理を行うことによって:
1) globalCompositeOperation の使用:
編集:はい、しかしいいえ:少なくともChromeでは、「destination-in」は仕様と一致しません:ソースは宛先の色を計算するために使用されるため、陰影のある色から単一の色を取得することはできません.
(私は JSBin を試してみました: http://jsbin.com/ecipiq/4/ )
また
2) getImageData と performance Array の使用:
- 一時キャンバスに境界線を引く
- キャンバスの getImageData
- 基になるデータの Uint32Array または Uint8Array ビューを取得する
- 配列内で線形にループします: 値 > しきい値の場合は境界線の色に設定します
- ターゲット キャンバスに楕円の塗りつぶしを描画します
- ターゲット キャンバスに ImageData を配置します。
どれ ?
- 2 つ目は、globalCompositeOperation が機能する必要はありません。
しかし、ほとんどのブラウザー (すべて?) では、ImageData の get/put が非常に遅く、この事実
だけでこのソリューションが無効になる可能性があります。
良い点は、アンチエイリアスを解除する方法を正確に決定できることです。
他の StackOverflow メンバーは、これらすべてについて洞察を持っているかもしれません。
これらのソリューションはいずれも、手書きの非エイリアス楕円関数よりもはるかに高速です。
最初のソリューションの便利なリンク:
http://www.html5rocks.com/en/tutorials/webgl/typed_arrays/
より速く開始するための注意事項
: ImageData で UInt32Array ビューを取得するには、次のようにします。
var myGetImageData = myTempCanvas.getImageData(0,0,sizeX, sizeY);
sourceBuffer32 = new UInt32Array(myGetImageData.data.buffer);
次に、sourceBuffer32[i] には、1 つの符号なし 32 ビット int にパックされた赤、緑、青、および透明度が含まれます。0 と比較して、ピクセルが黒でないかどうかを確認します ( != (0,0,0,0) )
または、 Uint8Array ビューでより正確にすることができます:
var myGetImageData = myTempCanvas.getImageData(0,0,sizeX, sizeY);
sourceBuffer8 = new Uint8Array(myGetImageData.data.buffer);
グレーの色合いだけを扱う場合は、R=G=B となるので注意してください。
sourceBuffer8[4*i]>Threshold
UInt32Array ビューを使用して、i 番目のピクセルを一度に黒に設定できます。
sourceBuffer32[i]=(255<<24)||(255<<16)||(255<<8);
この例から、灰色/黒以外の色を処理する方法を理解できるはずです。