Pergunta

Estou preso tentando ligar um único pixel em um formulário do Windows.

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

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

A API realmente deve ter um método para definir a cor de um pixel, mas não vejo um.

Estou usando C#.

Foi útil?

Solução

Isso definirá um único pixel:

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

Outras dicas

o Graphics O objeto não tem isso, pois é uma abstração e pode ser usado para cobrir um formato gráfico vetorial. Nesse contexto, definir um único pixel não faria sentido. o Bitmap O formato de imagem tem GetPixel() e SetPixel(), mas não um objeto gráfico construído em um. Para o seu cenário, sua opção realmente parece a única, porque não há uma maneira única de definir um único pixel para um objeto gráfico geral (e você não sabe exatamente o que é, como seu controle/formulário pode ser buffer duplo, etc.)

Por que você precisa definir um único pixel?

Só para mostrar o código completo para Henk Holterman Resposta:

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

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

Onde estou desenhando muitos pixels únicos (para vários displays de dados personalizados), costumo desenhar um bitmap e depois prendê -lo na tela.

As operações de bitmap getpixel e setpixel não são particularmente rápidas porque fazem uma enorme quantidade de escalões de limites, mas é muito fácil fazer uma classe de bitmap 'rápida' que tem acesso rápido a um bitmap.

Aparentemente, o DrawLine desenha uma linha que é um pixel aquém do comprimento especificado real. Parece não haver um DrawPoint/DrawPixel/Othnot, mas você pode usar o drawrectangle com largura e altura definida como 1 para desenhar um único pixel.

Página msdn no GETHDC

Eu acho que isto é o que você está procurando. Você precisará obter o HDC e, em seguida, usar as chamadas GDI para usar o setPixel. Observe que um ColorRef no GDI é um DWORD que armazena uma cor BGR. Não há canal alfa e não é RGB como a estrutura de cores do GDI+.

Esta é uma pequena seção de código que escrevi para realizar a mesma tarefa:

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);
    }
    ...
}

Desenhar uma linha 2px usando uma caneta com DashStyle.dashStyle.dot desenha um único pixel.

    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);
        }
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top