c# - relleno - Dibuja un solo píxel en Windows Forms
dibujar en picturebox c# (7)
Aparentemente, DrawLine dibuja una línea que tiene un píxel por debajo de la longitud real especificada. No parece haber un DrawPoint / DrawPixel / whatnot, pero en su lugar puede usar DrawRectangle con ancho y alto establecidos en 1 para dibujar un solo píxel.
Estoy atrapado tratando de activar un solo píxel en Windows Form.
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 uno.
Estoy usando C #.
Cuando estoy dibujando muchos píxeles individuales (para varias visualizaciones de datos personalizadas), tiendo a dibujarlos en un mapa de bits y luego ajustarlos a la pantalla.
Las operaciones de mapa de bits GetPixel y SetPixel no son particularmente rápidas porque hacen una gran cantidad de comprobación de límites, pero es bastante fácil crear una clase de "mapa de bits rápido" que tenga acceso rápido a un mapa de bits.
Dibujar una Línea 2px usando una Pluma con DashStyle.DashStyle.Dot dibuja un solo 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);
}
}
El objeto Graphics
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. El formato de imagen de Bitmap
tiene GetPixel()
y SetPixel()
, pero no un objeto de gráficos creado en uno. Para su escenario, su opción realmente parece ser la única porque no hay una forma única de ajustar un solo píxel para un objeto gráfico general (y usted no sabe EXACTAMENTE cuál es, como su control / forma podría ser doble-buffer, etc.)
¿Por qué necesitas establecer un solo píxel?
Esto establecerá un solo píxel:
e.Graphics.FillRectangle(aBrush, x, y, 1, 1);
Solo para mostrar el código completo para la respuesta de Henk Holterman:
Brush aBrush = (Brush)Brushes.Black;
Graphics g = this.CreateGraphics();
g.FillRectangle(aBrush, x, y, 1, 1);
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 un 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);
}
...
}