Нарисуйте один пиксель в Windows Forms

Я застреваю, пытаясь включить один пиксель в Windows Form.

graphics.DrawLine(Pens.Black, 50, 50, 51, 50); // draws two pixels

graphics.DrawLine(Pens.Black, 50, 50, 50, 50); // draws no pixels

API действительно должен иметь способ установить цвет одного пикселя, но я его не вижу.

Я использую С#.

Ответ 1

Это установит один пиксель:

e.Graphics.FillRectangle(aBrush, x, y, 1, 1);

Ответ 2

Объект Graphics не имеет этого, поскольку он является абстракцией и может использоваться для покрытия формата векторной графики. В этом контексте установка одного пикселя не имеет смысла. Формат изображения Bitmap имеет GetPixel() и SetPixel(), но не графический объект, построенный на нем. Для вашего сценария ваш вариант действительно кажется единственным, потому что нет единого размера для установки одного пикселя для общего графического объекта (и вы не знаете ТОЧНО, что это такое, поскольку ваш элемент управления/формы может быть двухбуферизованным и т.д.)

Зачем вам нужно установить один пиксель?

Ответ 3

Просто, чтобы показать полный код для ответа Хенка Холтермана:

Brush aBrush = (Brush)Brushes.Black;
Graphics g = this.CreateGraphics();

g.FillRectangle(aBrush, x, y, 1, 1);

Ответ 4

Где я рисую много одиночных пикселей (для различных пользовательских дисплеев данных), я склонен рисовать их в растровое изображение, а затем blit на экране.

Операции Bitmap GetPixel и SetPixel не особенно быстры, потому что они выполняют очень много ограничений, но довольно просто создать класс быстрого bitmap, который имеет быстрый доступ к растровому изображению.

Ответ 5

По-видимому DrawLine рисует линию, которая на один пиксель меньше фактической указанной длины. Кажется, что нет DrawPoint/DrawPixel/whatnot, но вместо этого вы можете использовать DrawRectangle с шириной и высотой, установленными в 1, чтобы нарисовать один пиксель.

Ответ 6

Страница MSDN на GetHdc

Я думаю, что это то, что вы ищете. Вам нужно будет получить HDC, а затем использовать вызовы GDI для использования SetPixel. Обратите внимание, что COLORREF в GDI является DWORD, сохраняющим цвет BGR. Нет альфа-канала, и это не RGB, как структура цвета GDI +.

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

public class GDI
{
    [System.Runtime.InteropServices.DllImport("gdi32.dll")]
    internal static extern bool SetPixel(IntPtr hdc, int X, int Y, uint crColor);
}

{
    ...
    private void OnPanel_Paint(object sender, PaintEventArgs e)
    {
        int renderWidth = GetRenderWidth();
        int renderHeight = GetRenderHeight();
        IntPtr hdc = e.Graphics.GetHdc();

        for (int y = 0; y < renderHeight; y++)
        {
            for (int x = 0; x < renderWidth; x++)
            {
                Color pixelColor = GetPixelColor(x, y);

                // NOTE: GDI colors are BGR, not ARGB.
                uint colorRef = (uint)((pixelColor.B << 16) | (pixelColor.G << 8) | (pixelColor.R));
                GDI.SetPixel(hdc, x, y, colorRef);
            }
        }

        e.Graphics.ReleaseHdc(hdc);
    }
    ...
}

Ответ 7

Рисование линии 2px с помощью Pen с DashStyle.DashStyle.Dot рисует один пиксель.

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        using (Pen p = new Pen(Brushes.Black))
        {
            p.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
            e.Graphics.DrawLine(p, 10, 10, 11, 10);
        }
    }