在Windows窗体上绘制一个像素

我被困在试图打开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#。

这将设置一个像素:

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

Graphics对象没有这个,因为它是一个抽象,可以用来覆盖vectorgraphics格式。 在这种情况下,设置一个像素是没有意义的。 Bitmap图像格式确实具有GetPixel()SetPixel() ,但不包含构build于其上的graphics对象。 对于你的场景,你的select似乎是唯一的select,因为没有一个通用的graphics对象设置单个像素的方式(你不知道它是什么,作为你的控制/表单可以是双缓冲等)

为什么你需要设置一个像素?

只是为了显示Henk Holterman的完整代码回答:

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

在我绘制大量单个像素(针对各种自定义数据显示)的地方,我倾向于将它们绘制成位图,然后将其粘贴到屏幕上。

位图GetPixel和SetPixel操作并不是特别快,因为它执行了大量的边界检查,但是制作一个快速访问位图的“快速位图”类是相当容易的。

显然,DrawLine会绘制一条与实际指定长度相差一个像素的线。 似乎没有DrawPoint / DrawPixel / whatnot,但是可以使用宽度和高度设置为1的DrawRectangle绘制单个像素。

GetHdc上的MSDN页面

我想这就是你要找的。 您将需要获取HDC,然后使用GDI调用来使用SetPixel。 请注意,GDI中的COLORREF是存储BGR颜色的DWORD。 没有alpha通道,它不像GDI +的Color结构那样是RGB。

这是我写的一小段代码来完成相同的任务:

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

用DashStyle.DashStyle.Dot绘制一条线2px绘制一个像素。

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