Estoy atascado tratando de activar un solo píxel en un formulario de Windows.
graphics.DrawLine(Pens.Black, 50, 50, 51, 50); // draws two pixels
graphics.DrawLine(Pens.Black, 50, 50, 50, 50); // draws no pixels
La API realmente debería tener un método para establecer el color de un píxel, pero no veo ninguno.
Estoy usando C #.
Respuestas:
Esto establecerá un solo píxel:
e.Graphics.FillRectangle(aBrush, x, y, 1, 1);
fuente
DrawRectangle()
. Si lo tienePen.Alignment = PenAlignment.Outset
, dibujaráPen.Width
un contorno grueso de píxeles alrededor del rectángulo dado. Pero si lo especificaPen.Alignment = PenAlignment.Inset
, dibujará un "contorno" grueso de píxeles de Pen.Width dentro del rectángulo dado.Solo para mostrar el código completo de la respuesta de Henk Holterman:
Brush aBrush = (Brush)Brushes.Black; Graphics g = this.CreateGraphics(); g.FillRectangle(aBrush, x, y, 1, 1);
fuente
El
Graphics
objeto no tiene esto, ya que es una abstracción y podría usarse para cubrir un formato de gráficos vectoriales. En ese contexto, establecer un solo píxel no tendría sentido. ElBitmap
formato de imagen tieneGetPixel()
ySetPixel()
, pero no un objeto gráfico construido sobre uno. Para su escenario, su opción realmente parece ser la única porque no hay una forma única de establecer un solo píxel para un objeto gráfico general (y no sabe EXACTAMENTE qué es, ya que su control / formulario podría tener doble búfer, etc.)¿Por qué necesita establecer un solo píxel?
fuente
Cuando estoy dibujando muchos píxeles individuales (para varias pantallas de datos personalizadas), tiendo a dibujarlos en un mapa de bits y luego mostrarlos en la pantalla.
Las operaciones Bitmap GetPixel y SetPixel no son particularmente rápidas porque hacen una gran cantidad de verificación de límites, pero es bastante fácil hacer una clase de 'mapa de bits rápido' que tenga acceso rápido a un mapa de bits.
fuente
Página de MSDN en GetHdc
Creo que esto es lo que estás buscando. Necesitará obtener el HDC y luego usar las llamadas GDI para usar SetPixel. Tenga en cuenta que un COLORREF en GDI es un DWORD que almacena un color BGR. No hay canal alfa y no es RGB como la estructura de color 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); } ... }
fuente
Aparentemente, DrawLine dibuja una línea que es un píxel menos que la longitud real especificada. No parece haber un DrawPoint / DrawPixel / otras cosas, pero en su lugar puede usar DrawRectangle con el ancho y el alto establecidos en 1 para dibujar un solo píxel.
fuente
Dibujar una línea de 2px con un lápiz con DashStyle.DashStyle.Dot dibuja un solo 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); } }
fuente