手書きのストロークを描画するアプリケーションに取り組んでいます。ストロークはポイントのベクトルとして内部的に保存され、 に変換できますstd::vector<Gdiplus::Point>
。点は互いに非常に接近しているため、各点を単純に描画すると、連続したストロークのイメージが得られます。
Graphics.DrawEllipse
これらのポイントを描画するために (GDI+) メソッドを使用しています。コードは次のとおりです。
// prepare bitmap:
Bitmap *bitmap = new Gdiplus::Bitmap(w, h, PixelFormat32bppRGB);
Graphics graphics(bitmap);
// draw the white background:
SolidBrush myBrush(Color::White);
graphics.FillRectangle(&myBrush, 0, 0, w, h);
Pen blackPen(Color::Black);
blackPen.SetWidth(1.4f);
// draw stroke:
std::vector<Gdiplus::Point> stroke = getStroke();
for (UINT i = 0; i < stroke.size(); ++i)
{
// draw point:
graphics.DrawEllipse(&blackPen, stroke[i].X, stroke[i].Y, 2, 2);
}
最後に、これbitmap
を PNG 画像として保存するだけで、次の問題が発生することがあります。
ストロークでこの「穴」を見たとき、もう一度ポイントを描画することにしましたが、今回は、幅と高さを に設定した楕円を1
使用redPen
して、幅を に設定しました0.1f
。上記のコードの直後に、次のコードを追加しました。
Pen redPen(Color::Red);
redPen.SetWidth(0.1f);
for (UINT i = 0; i < stroke.size(); ++i)
{
// draw point:
graphics.DrawEllipse(&redPen, stroke[i].X, stroke[i].Y, 1, 1);
}
そして、私が手に入れた新しいストークは次のように見えました:
Graphics.DrawRectangle
この新しい赤いストロークを描画する代わりに使用するDrawEllipse
と、このストローク (長方形を描画して描画) に異なる幅や穴ができることはありません。
円を描くとこの奇妙な動作が発生する理由は考えられません。を使用すると、ストロークが常に継続的で、決して変形しないのはGraphics.DrawRectangle
なぜですか? ここで何が起こっているのか、誰か説明してもらえますか? 何か不足していますか?
ところで、私は Windows XP を使用しています (たとえば、既知のバグの場合)。どんな助けでも大歓迎です。