3

我正在开发一个绘制手写笔画的应用程序。笔划在内部存储为点向量,它们可以转换为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图像,有时会出现以下问题:

问题

当我在 stroke 中看到这个“洞”时,我决定再次绘制我的点,但这一次,使用宽度和高度设置为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);
}

我得到的新斯托克看起来像这样: 问题2

当我使用Graphics.DrawRectangle而不是DrawEllipse在绘制这个新的红色笔划时,它永远不会发生这种笔划(通过绘制矩形绘制)会有不同的宽度或孔:

矩形

我想不出任何可能的原因,为什么画圈会导致这种奇怪的行为。为什么当我使用时,中风总是连续的并且从未以任何方式变形Graphics.DrawRectangle?谁能解释一下,这是怎么回事?我错过了什么吗?

顺便说一句,我使用的是 Windows XP(例如,如果它是一个已知的错误)。任何帮助将不胜感激。

4

1 回答 1

2

我做了错误的假设,如果我用Graphics.DrawEllipse宽度约 2px 的笔绘制半径等于 2px 的圆,它将导致绘制直径约 4-5 px 的实心圆。
但是我发现我实际上不能在用这种方式画圆时依赖笔的宽度。此方法仅用于绘制这种形状的边框,因此绘制填充椭圆最好使用Graphics.FillEllipse.

另一个需要考虑的非常重要的事实是,这两个函数都将指定“指定椭圆边界的矩形的左上角”的坐标作为参数,因此我应该从两个坐标中减去一半的半径以确保原始坐标指定这个圆的中间。

这是新代码:

// draw the white background:
SolidBrush whiteBrush(Color::White);
graphics.FillRectangle(&whiteBrush, 0, 0, w, h);

// draw stroke:
Pen blackBrush(Color::Black);
std::vector<Gdiplus::Point> stroke = getStroke();
for (UINT i = 0; i < stroke.size(); ++i)
    graphics.FillEllipse(&blackBrush, stroke[i].X - 2, stroke[i].Y - 2, 4, 4);

// draw original points:
Pen redBrush(Color::Red);
std::vector<Gdiplus::Point> origStroke = getOriginalStroke();
for (UINT i = 0; i < origStroke.size(); ++i)
    graphics.FillRectangle(&redBrush, origStroke[i].X, origStroke[i].Y, 1, 1);

产生以下结果:

正确的笔画

因此,如果有人会遇到和我一样的问题,解决方案是:

在此处输入图像描述

于 2013-02-07T16:17:27.093 回答