在Windows窗体上绘制一个像素

Mar*_*k T 86 .net c# gdi+ pixel winforms

我试图打开Windows窗体上的单个像素.

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

graphics.DrawLine(Pens.Black, 50, 50, 50, 50); // draws no pixels
Run Code Online (Sandbox Code Playgroud)

API真的应该有一个方法来设置一个像素的颜色,但我没有看到一个.

我正在使用C#.

Hen*_*man 110

这将设置一个像素:

e.Graphics.FillRectangle(aBrush, x, y, 1, 1);
Run Code Online (Sandbox Code Playgroud)

  • 谁会猜到DrawRectangle绘制一个2x2但FillRectange使用相同的参数绘制1x1?谢谢. (16认同)
  • @马克:这确实让某种意义上说...... DrawRectangle的说:"画起点为x和这个宽度和高度Y的轮廓,"所以它吸引着开始和结束点(X,Y,X + 1,Y ; x,y + 1; x + 1,y + 1)和它们之间的线.FillRectangle说"从这个宽度和高度的x,y开始绘制一个坚固的表面." 顺便说一句,FillRectangle采用Brush而不是Pen. (9认同)
  • 我不喜欢这个答案.这种方式非常低效. (6认同)
  • @R.Bemrose:实际上,它取决于你传递给'DrawRectangle()`的Pen对象.如果它具有`Pen.Alignment = PenAlignment.Outset`,它将在给定矩形周围绘制`Pen.Width`像素粗轮廓.但是如果指定`Pen.Alignment = PenAlignment.Inset`,它将在给定矩形内绘制Pen.Width像素粗"轮廓". (5认同)
  • 这是一个非常不令人满意的答案.虽然这设置了单个像素,但要求并不总是设置文字像素.我经常需要这种情况,通常情况下,我需要用绘制线条的相同笔绘制点,而不是画笔.换句话说,我们需要一条比2像素短的线.我怀疑这是OP所需要的. (2认同)

Ada*_*son 17

Graphics对象没有这个,因为它是一个抽象,可以用来覆盖矢量图形格式.在这种情况下,设置单个像素是没有意义的.该Bitmap图像格式确实有GetPixel()SetPixel(),但没有一个图形对象建立在一个.对于您的场景,您的选项看起来确实是唯一的选项,因为没有一种通用的方式为一般图形对象设置单个像素(并且您不完全知道它是什么,作为您的控件/表单可以是双缓冲等等)

为什么需要设置单个像素?


Woo*_*DRN 17

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

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

g.FillRectangle(aBrush, x, y, 1, 1);
Run Code Online (Sandbox Code Playgroud)


Wil*_*ean 9

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

Bitmap GetPixel和SetPixel操作并不是特别快,因为它们进行了大量的边界检查,但是很容易制作一个可以快速访问位图的"快速位图"类.