Нарисуйте один пиксель в Windows Forms - PullRequest
85 голосов
/ 17 апреля 2009

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

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

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

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

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

Ответы [ 7 ]

108 голосов
/ 17 апреля 2009

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

e.Graphics.FillRectangle(aBrush, x, y, 1, 1);
17 голосов
/ 01 мая 2014

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

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

g.FillRectangle(aBrush, x, y, 1, 1);
17 голосов
/ 17 апреля 2009

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

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

9 голосов
/ 17 апреля 2009

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

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

1 голос
/ 13 марта 2015

Страница 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);
    }
    ...
}
1 голос
/ 17 апреля 2009

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

0 голосов
/ 22 октября 2016

Рисование линии 2px с помощью пера с 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);
        }
    }
...