Estoy atascado tratando de convertir en un único píxel en un Formulario Windows forms.

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

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

La API que realmente debe tener un método para establecer el color de un píxel, pero no veo uno.

Estoy usando C#.

  • Hice un control de que las parcelas de algunos muy bonito científica gráficos (con el agregado de capacidades no disponibles en cualquier comercial de los controles). Me puede trazar un punto de datos con e X o + o una caja pequeña. Pero para los datos sin importancia, solo quiero un solo píxel.
  • Todas las respuestas que veo parece que ellos realmente son un exceso para un solo píxel? ¿Por qué parece más fácil simplemente hacer un buffer[y*ancho+x]=color;
InformationsquelleAutor Mark T | 2009-04-17

7 Comentarios

  1. 110

    De esta forma se establecerá un único píxel:

    e.Graphics.FillRectangle(aBrush, x, y, 1, 1);
    • Quién hubiera imaginado que DrawRectangle dibuja un 2×2 pero FillRectange dibuja un 1×1 con los mismos argumentos? Gracias.
    • Se hace una especie de sentido… DrawRectangle dice «dibujar un esquema de partida en x e y de esta anchura y altura», por lo que atrae tanto a los puntos de inicio y final (x,y; x+1,y;x,y+1; x+1,y+1) y las líneas entre ellos. FillRectangle dice que «dibuje una superficie sólida partir de x,y de esta anchura y la altura.» Por cierto, FillRectangle toma un Pincel, no un Lápiz.
    • Bemrose: en Realidad, depende de la Pluma objeto de pasar a DrawRectangle(). Si tiene Pen.Alignment = PenAlignment.Outset va a dibujar Pen.Width píxeles de grosor de contorno ronda el rectángulo determinado. Pero si se especifica Pen.Alignment = PenAlignment.Inset va a sacar de la Pluma.Ancho de píxeles de grosor «esquema» en el interior del rectángulo determinado.
    • Este es un muy insatisfactoria respuesta. A pesar de esto, se establece un único píxel, el requisito no es siempre para establecer un literal de píxeles. Todas las veces que lo he necesitado, lo que a menudo, he necesitado el punto para ser atraídos por el mismo lápiz que se dibujan las líneas con, no una brocha. En otras palabras, necesitamos una línea que es más corto que el 2 píxeles. Sospecho que es lo que el OP sea necesario.
    • No me gusta esta respuesta. De esta manera es altamente ineficiente.
  2. 17

    La Graphics objeto no tiene esto, ya que es una abstracción y que podría ser utilizado para cubrir un vector de formato de gráficos. En ese contexto, el establecimiento de un único píxel no tendría sentido. El Bitmap formato de imagen tiene GetPixel() y SetPixel(), pero no un objeto graphics construida en una sola. Por su escenario, su opción realmente parece el único porque no hay una talla única manera de establecer un único píxel por un objeto graphics (y usted no sabe EXACTAMENTE lo que es, como su control/formulario podría ser el doble buffer, etc.)

    Por qué usted necesita para establecer un único píxel?

  3. 17

    Solo para mostrar el código completo de Henk Holterman respuesta:

    Brush aBrush = (Brush)Brushes.Black;
    Graphics g = this.CreateGraphics();
    
    g.FillRectangle(aBrush, x, y, 1, 1);
  4. 9

    Donde estoy de sorteo de una sola píxeles (para varios personalizar los datos muestra), tiendo a dibujar un mapa de bits y, a continuación, blit que en la pantalla.

    El mapa de bits GetPixel y SetPixel operaciones no son especialmente rápidos, ya que hacer un montón de boundschecking, pero es muy fácil hacer un rápido mapa de bits de la clase de los que tiene un rápido acceso a un mapa de bits.

  5. 1

    Aparentemente DrawLine dibuja una línea que es un píxel aparte de la longitud especificada. No parece ser un DrawPoint/DrawPixel/lo que sea, pero en su lugar puede utilizar DrawRectangle con la anchura y la altura se establece en 1 para dibujar un solo píxel.

    • Buen intento, pero con un tamaño de 1 dibuja 2×2 píxeles. (Dibujar junto a una línea, y usted puede ver que es el doble del ancho.) Y con un tamaño de cero, por supuesto, no dibuja nada.
    • A la derecha, mi error. 🙂 Bueno FillRectangle hace el truco.
    • Pero DrawLine dibuja corto.
  6. 1

    Página de MSDN en GetHdc

    Creo que esto es lo que usted está buscando. Usted tendrá que obtener el HDC y, a continuación, utilizar la GDI llamadas a utilizar SetPixel. Tenga en cuenta, que un COLORREF en GDI es un valor DWORD almacenar un BGR color. No hay ningún canal alfa, y no es RGB como el Color de la estructura de GDI+.

    Esta es una pequeña sección de código que escribí para realizar la misma tarea:

    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. -1

    El dibujo de una Línea de 2px el uso de un Lápiz con DashStyle.DashStyle.Punto dibuja un único Píxel.

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

Dejar respuesta

Please enter your comment!
Please enter your name here