System.Drawing.Graphics - PullRequest
       4

System.Drawing.Graphics

1 голос
/ 14 марта 2011

Возможно ли получить все точки объектов, которые мы нарисовали, используя объект Graphics. Например, я нарисовал эллипс, используя Крах

Graphics g = this.GetGraphics();
g.DrawEllipse(Pens.Red, 300, 300, 100, 200);

Чем Как я могу получить все точки или пиксели, нарисованные этой функцией Или же можно получить все точки или пиксели, нарисованные на форме.

спасибо ..........

Ответы [ 2 ]

3 голосов
/ 14 марта 2011

Нет встроенной функции - насколько я знаю.Но вычислить все эти точки не составит труда, так как вам просто нужно иметь функцию для вычисления в соответствии с функцией фигуры.

Эллипс имеет эту функцию, вы можете просто поместить значения Xот начала до конца и вычислите Y из него, который должен дать вам все очки:

enter image description here

1 голос
/ 14 марта 2011

Чтобы ответить на вторую часть вашего вопроса о том, как найти затронутые пиксели:

Я бы высоко рекомендовал бы математическое решение, как указано выше.Однако для опции brute-force можно просто создать изображение, нарисовать его, а затем перебрать каждый пиксель, чтобы найти затронутые пиксели.Это будет работать, но будет очень медленным по сравнению с настоящим математическим решением.Он будет расти медленнее с увеличением размера изображения.

Это будет , а не , если вы сглаживаете нарисованный круг, тогда как они могут быть затененными и прозрачными.Однако он будет работать для того, что вы перечислили выше.

например

...

List<Point> points = CreateImage(Color.Red,600,600);

...

    private List<Point> CreateImage(Color drawColor, int width, int height)
    {
        // Create new temporary bitmap.
        Bitmap background = new Bitmap(width, height);

        // Create new graphics object.
        Graphics buffer = Graphics.FromImage(background);

        // Draw your circle.
        buffer.DrawEllipse(new Pen(drawColor,1), 300, 300, 100, 200);

        // Set the background of the form to your newly created bitmap, if desired.
        this.BackgroundImage = background;

        // Create a list to hold points, and loop through each pixel.
        List<Point> points = new List<Point>();
        for (int y = 0; y < background.Height; y++)
        {
            for (int x = 0; x < background.Width; x++)
            {
                // Does the pixel color match the drawing color?
                // If so, add it to our list of points.
                Color c = background.GetPixel(x,y);
                if (c.A == drawColor.A &&
                    c.R == drawColor.R &&
                    c.G == drawColor.G &&
                    c.B == drawColor.B)
                {
                    points.Add(new Point(x,y));
                }
            }
        }
        return points;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...