访问C#中的单个像素

时间:2009-01-24 16:25:20

标签: c# pixel draw windows

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

谢谢, 马勒基。

5 个答案:

答案 0 :(得分:3)

使用CreateGraphics()方法,这应该有效:

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

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

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

如果你想要一个视口,放置一个面板或一个PictureBox(可能有Dock:Fill),然后使用:

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。

答案 1 :(得分:2)

Christian Graus在www.CodeProject.com上有几篇很好的图形处理文章。他们应该回答你的问题。

答案 2 :(得分:1)

3D编辑器应用程序不仅需要在屏幕上绘图 - 它还需要快速完成。 .NET中的标准方法是使用Bitmap和Graphics类,如 person-b 所述。但这会很慢。您可以使用 Bitmap.LockBits()和巧妙的优化来提高速度,但总而言之,我怀疑您仍然可以获得所需的性能。你将吃掉所有的CPU,并且仍然会被低于10-20 FPS的卡住(数字是一个疯狂的猜测)。硬件加速是真正的方法。 shuggycouk 有正确方向的链接。

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

答案 3 :(得分:0)

如果你正在使用3d,那么现在使用几乎所有GPU下的硬件加速是有意义的。如果您愿意继续使用Windows特定的api,那么现在可以通过managed wrappers公开DirectX的3D API。另外还有XNA工具集主要是考虑到游戏而设计的,但它提供了大量有关如何从c#进行Direct-X 3D加速绘图的示例。

答案 4 :(得分:0)

如果您需要像素速度high-speed-graphing-control-for-net-or-mfc,可能会提供一些提示。