在C#中访问单个像素

我现在正在做一个学校项目。 这意味着一个3D编辑软件,(像一个非常小的Maya版本)。 我必须用C#编写,使用“Windows应用程序项目”。 我打算自己实现所有的3D素材,从投影到阴影。 我的问题是,如何才能直接访问C#窗口应用程序中的单个像素? 我知道我将在窗口中有一个主视图端口。 但是我还没有决定如何做。 有没有一个内置的对象,我可以使用,这将让我定义的视图端口的边界,然后绘制每个像素单独? (我只是在黑暗中拍摄,我不太了解C#,我主要用C编程)

谢谢,Malki。

Solutions Collecting From Web of "在C#中访问单个像素"

使用CreateGraphics()方法,这应该工作:

Bitmap b = new Bitmap(Width, Height, this.CreateGraphics()); //pixel is: Color c = b.GetPixel(x, y); 

要将像素设置为特定颜色,请使用此Color c = b.GetPixel(x,y)代替Color c = b.GetPixel(x,y)

 b.SetPixel(x, y, c); // where c is a Color 

如果你想要一个视口,放置一个面板或一个PictureBox(也许与Dock:填充),然后使用:

 Bitmap b = new Bitmap(viewport.Width, viewport.Height, viewport.CreateGraphics()); 

而不是之前使用的第一行。

但是从你想做的事情来看,我认为使用OnPaint事件会更好:

 void pnlViewport_Paint(object sender, PaintEventArgs e) { if ( e.ClipRectange.Width < 1 || e.ClipRectangle.Height < 1 ) return; Bitmap b = new Bitmap(e.ClipRectangle.Width, e.ClipRectangle.Height, e.Graphics); // ... } 

每当需要绘制控制需求时,都会触发此事件。 第一行检查正在绘制的区域是否为空 – 这不仅会节省CPU时间,而且可能会导致应用程序崩溃 – 您需要创建一个0x0位图。

编辑 :是的,这是可调整大小,如果Dock = DockStyle.Fill; 当你的窗口调整大小时,控件将扩大以填充空间。 然后重新绘制 – 发射事件。

编辑2 :正如其他人指出的,这仍然是缓慢的。 这听起来像是自己做3D绘图的要求,所以也许SDL.NET (我认为可以使用硬件加速)是一条路。 它甚至有一个(慢)SurfaceControl使用。

基督教格拉斯在www.CodeProject.com有几个很好的图形处理文章。 他们应该回答你的问题。

3D编辑器应用程序不仅需要在屏幕上绘制 – 它需要快速完成。 .NET中的标准方法是使用位图和图形类,如person-b所述 。 但这会很慢。 你可以通过使用Bitmap.LockBits()和巧妙的优化来提高速度,但总的来说,我怀疑你仍然会得到你需要的性能。 你会吃掉所有的CPU,并仍然会停留在少于10-20 FPS(数字是疯狂的猜测)。 硬件加速是真正的方法。 shuggycouk有正确的方向链接。

不幸的是,硬件方法也会带走预测和阴影,因为硬件就是这样。 所以我不知道你是否可以使用它…也许在.NET中寻找关于“覆盖”的信息。 这就是所有媒体播放器软件显示电影的方式。 它的速度肯定比标准的GDI / GDI +更快,而且仍然是2D的。 或者也许你可以用DirectX做一个棘手的解决方法 – 用它来绘制你自己定义的2D形状。 ;)

如果你在做3d,那么现在几乎所有的GPU都可以使用硬件加速技术。 如果您很乐意继续使用特定于Windows的API,那么DirectX的3D API现在将通过托管包装提供 。 另外还有XNA工具集,主要是为了游戏而设计的,但它提供了大量关于如何使用C#实现Direct-X 3D加速绘图的例子。

如果您需要像素速度,则可以提供一些提示,例如高速图形控制网络或mfc 。