私は <canvas>
要素、線の描画など。
対角線がアンチエイリアス処理されていることに気付きました。私がやっていることのジャギーな外観を好む-この機能をオフにする方法はありますか?
画像には context.imageSmoothingEnabled
= false
。
ただし、線の描画を明示的に制御するものは何もありません。 getImageData
とputImageData
を使用して、独自の線( 難しい方法 )を描画する必要がある場合があります。
ctx.lineTo(10.5, 10.5)
のような座標に_1-pixel
_行を描画します。ポイント_(10, 10)
_に1ピクセルの線を引くことは、その位置のこの_1
_ピクセルが_9.5
_から_10.5
_に到達することを意味します。キャンバス。
1ピクセルの行がたくさんある場合は、描画する実際の座標に_0.5
_を常に追加する必要はないという素敵なトリックは、キャンバス全体でctx.translate(0.5, 0.5)
することです始まり。
Mozilla Firefoxで実行できます。これをコードに追加します。
contextXYZ.mozImageSmoothingEnabled = false;
Operaこれは現在機能のリクエストですが、うまくいけばすぐに追加されるでしょう。
アンチエイリアスはrequiredで、非整数座標(0.4、0.4)を含むベクトルグラフィックの正しいプロットに使用されます。
整数以外の座標を指定すると、キャンバスには2つのオプションがあります。
後者の戦略は静的グラフィックスで機能しますが、小さなグラフィックス(半径2の円)では曲線は滑らかな曲線ではなく明確なステップを示します。
本当の問題は、グラフィックスが移動(移動)するときです。1つのピクセルと別のピクセル(1.6 => 2、1.4 => 1)の間のジャンプは、形状の原点が親コンテナに関連してジャンプする(常にシフトする)ことを意味します1ピクセル上下/左)。
ヒント#1:キャンバスをスケーリング(たとえばx)してアンチエイリアスを弱め(または強化)し、逆スケール(1/x)を適用します自分でジオメトリを作成します(キャンバスを使用しません)。
比較(スケーリングなし):
(キャンバススケール:0.75、手動スケール:1.33):
および(キャンバススケール:1.33、手動スケール:0.75):
ヒント#2:ジャギーな外観が本当に必要な場合は、各図形を(消去せずに)数回描画してみてください。描画するたびに、アンチエイリアスピクセルが暗くなります。
比較してください。一度描画した後:
3回描画した後:
Bresenhamのラインアルゴリズムなどのカスタムラインアルゴリズムを使用してすべてを描画します。このjavascript実装を確認してください: http://members.chello.at/easyfilter/canvas.html
これは間違いなくあなたの問題を解決すると思います。
画像を縮小してキャンバスに描画するときに問題が発生したことを付け加えます。アップスケーリングでは使用していませんでしたが、スムージングを使用していました。
私はこれを使って解決しました:
function setpixelated(context){
context['imageSmoothingEnabled'] = false; /* standard */
context['mozImageSmoothingEnabled'] = false; /* Firefox */
context['oImageSmoothingEnabled'] = false; /* Opera */
context['webkitImageSmoothingEnabled'] = false; /* Safari */
context['msImageSmoothingEnabled'] = false; /* IE */
}
この関数は次のように使用できます。
var canvas = document.getElementById('mycanvas')
setpixelated(canvas.getContext('2d'))
たぶん、これは誰かに役立つでしょう。
ctx.translate(0.5, 0.5);
ctx.lineWidth = .5;
このコンボを使用して、ニースの1pxの細い線を描画できます。
非常に限られたトリックに注意してください。 2色の画像を作成する場合、色#000000の背景に色#010101の任意の図形を描画できます。これが完了したら、imageData.data []の各ピクセルをテストし、0x00ではない値を0xFFに設定できます。
imageData = context2d.getImageData (0, 0, g.width, g.height);
for (i = 0; i != imageData.data.length; i ++) {
if (imageData.data[i] != 0x00)
imageData.data[i] = 0xFF;
}
context2d.putImageData (imageData, 0, 0);
結果は、アンチエイリアス処理されていない白黒画像になります。いくつかのアンチエイリアシングが行われるため、これは完全ではありませんが、このアンチエイリアシングは非常に制限され、形状の色は背景の色に非常に似ています。
StashOfCodeの答えに関する2つのメモ:
代わりにこれを行うことをお勧めします:
ストロークして#FFFFFF
で塗りつぶしてから、次の操作を行います。
imageData.data[i] = (imageData.data[i] >> 7) * 0xFF
それは1px幅の線でそれを解決します。
それ以外に、StashOfCodeのソリューションは、独自のラスター化関数を記述する必要がないため、完璧です(ラインだけでなく、ベジェ、円弧、穴のある多角形などを考えてください)