12

ここに画像の説明を入力

濃い灰色の線は黒で、幅は 1 ピクセルです。

pRT->DrawLine(Point2F(100, 120), Point2F(300, 120), blackbrush, 1);

明るい灰色の線は黒で、幅は 0.5 ピクセルです。

pRT->DrawLine(Point2F(120, 130), Point2F(280, 130), blackbrush, 0.5);

代わりに、両方とも 2 ピクセル幅です。幅2ピクセルでお願いしたら線が黒なんですが、当然幅2ピクセル。

レンダー ターゲットは、ウィンドウのクライアント領域と同じサイズです。GDIのようなピクセル精度、1座標= 1ピクセル、純粋な色が欲しい...

ありがとう。

4

2 に答える 2

20

Direct2D は正しくレンダリングされています。(100, 120) などのピクセル座標を指定すると、ピクセル座標 (100, 120) から (101, 121) までのピクセル要素の左上隅が参照されます (上/左は包括的であり、右/下は排他的です)。これは直線の水平線であるため、(99.5, 119.5) - (300.5, 120.5) から塗りつぶされた長方形を効果的に取得しています。このエッジが隣接するピクセルにこぼれるため、「間違った」明るさで「2 ピクセル幅」の線が表示されるのはそのためです。ピクセル座標(領域のない点) とピクセル要素(1x1 の領域を持つ画面上の物理的な点、またはもちろん 1 つだけ) の観点から考える必要があります。

ピクセル (100, 120) から (300, 120) をカバーする直線を描きたい場合は、SemMike のエイリアス レンダリングの使用に関する提案 (これは直線に最適です!) を使用するか、半分を使用することができます。 - ピクセル オフセット (strokeWidth=1 のため、他の strokeWidth については、strokeWidth/2 で調整)。(100.5, 120.5) - (299.5, 120.5) から線幅 1.0 で描画すると、探しているものが得られます。そのストロークは、指定したピクセル座標の周りに広がるため、ピクセル要素 (100, 120) - (300, 121) にわたって「塗りつぶされた四角形」が得られます。繰り返しますが、これは排他的な範囲であるため、'y=121' は実際には満たされず、x=300 も満たされません。

なぜこれが GDI のようなもので起こらないのか疑問に思っているのであれば、それはアンチエイリアス レンダリングを行わないためであり、すべてが常にピクセル要素にスナップします。Shapes を使用しているときに WPF でこれが発生しない理由は、レイアウトの丸め (UseLayoutRounding) とピクセルのスナップを使用しているためです。Direct2D は比較的低レベルの API であるため、これらのサービスを提供しません。

于 2012-05-27T11:43:27.637 に答える
5

で遊ぶことはできますがpRenderTarget->DrawLine(Point2F(100-0.5, 120-0.5), Point2F(300-0.5, 120-0.5), blackbrush, 1)、急速に難しくなります。最も簡単なのは次のとおりです。

pRenderTarget->SetAntialiasMode(D2D1_ANTIALIAS_MODE_ALIASED);

それが誰かを助けることを願っています...

于 2012-05-26T07:41:05.883 に答える